checkstyle

This commit is contained in:
jendave
2011-10-25 19:50:36 +00:00
parent 86517de8d5
commit cddfb559a1
11 changed files with 2532 additions and 1573 deletions

View File

@@ -6,23 +6,28 @@
package forge; package forge;
/** /**
* The class CardContainer. A card container is an object that references a card. * The class CardContainer. A card container is an object that references a
* card.
* *
* @author Clemens Koza * @author Clemens Koza
* @version V0.0 17.02.2010 * @version V0.0 17.02.2010
*/ */
public interface CardContainer { public interface CardContainer {
/** /**
* <p>setCard.</p> * <p>
* setCard.
* </p>
* *
* @param card a {@link forge.Card} object. * @param card
* a {@link forge.Card} object.
*/ */
void setCard(Card card); void setCard(Card card);
/** /**
* <p>getCard.</p> * <p>
* getCard.
* </p>
* *
* @return a {@link forge.Card} object. * @return a {@link forge.Card} object.
*/ */

View File

@@ -9,25 +9,28 @@ import net.slightlymagic.braids.util.lambda.Lambda1;
import com.google.code.jyield.Generator; import com.google.code.jyield.Generator;
/** /**
* <p>CardFilter class.</p> * <p>
* CardFilter class.
* </p>
* *
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
public class CardFilter { public class CardFilter {
/** /**
* Filter a sequence (iterable) of cards to a list of equal or smaller size * Filter a sequence (iterable) of cards to a list of equal or smaller size
* whose names contain the given substring. * whose names contain the given substring.
* *
* We perform the substring search without sensitivity to case. * We perform the substring search without sensitivity to case.
* *
* @param toBeFiltered an {@link java.lang.Iterable} of Card instances * @param toBeFiltered
* @param substring a {@link java.lang.String} object. * an {@link java.lang.Iterable} of Card instances
* @param substring
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public CardList cardListNameFilter(Iterable<Card> toBeFiltered, String substring) { public final CardList cardListNameFilter(final Iterable<Card> toBeFiltered, final String substring) {
String s; String s;
CardList listFilter = new CardList(); CardList listFilter = new CardList();
@@ -45,12 +48,16 @@ public class CardFilter {
} }
/** /**
* <p>CardListTextFilter.</p> * <p>
* CardListTextFilter.
* </p>
* *
* TODO style: rename this method so it starts with a lowercase letter * TODO style: rename this method so it starts with a lowercase letter
* *
* @param all a {@link forge.CardList} object. * @param all
* @param name a {@link java.lang.String} object. * a {@link forge.CardList} object.
* @param name
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList CardListTextFilter(CardList all, String name) { public final CardList CardListTextFilter(CardList all, String name) {
@@ -72,14 +79,17 @@ public class CardFilter {
return listFilter; return listFilter;
} }
/** /**
* <p>CardListColorFilter.</p> * <p>
* CardListColorFilter.
* </p>
* *
* TODO style: rename this method so it starts with a lowercase letter * TODO style: rename this method so it starts with a lowercase letter
* *
* @param all a {@link forge.CardList} object. * @param all
* @param name a {@link java.lang.String} object. * a {@link forge.CardList} object.
* @param name
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList CardListColorFilter(CardList all, String name) { public final CardList CardListColorFilter(CardList all, String name) {
@@ -89,7 +99,7 @@ public class CardFilter {
if (name == "black") { if (name == "black") {
for (int i = 0; i < all.size(); i++) { for (int i = 0; i < all.size(); i++) {
CardName = all.getCard(i); CardName = all.getCard(i);
if (CardUtil.getColors(CardName).contains(Constant.Color.Black) == false) { if (!CardUtil.getColors(CardName).contains(Constant.Color.Black)) {
listFilter.add(CardName); listFilter.add(CardName);
} }
@@ -99,7 +109,7 @@ public class CardFilter {
if (name == "blue") { if (name == "blue") {
for (int i = 0; i < all.size(); i++) { for (int i = 0; i < all.size(); i++) {
CardName = all.getCard(i); CardName = all.getCard(i);
if (CardUtil.getColors(CardName).contains(Constant.Color.Blue) == false) { if (!CardUtil.getColors(CardName).contains(Constant.Color.Blue)) {
listFilter.add(CardName); listFilter.add(CardName);
} }
@@ -109,7 +119,7 @@ public class CardFilter {
if (name == "green") { if (name == "green") {
for (int i = 0; i < all.size(); i++) { for (int i = 0; i < all.size(); i++) {
CardName = all.getCard(i); CardName = all.getCard(i);
if (CardUtil.getColors(CardName).contains(Constant.Color.Green) == false) { if (!CardUtil.getColors(CardName).contains(Constant.Color.Green)) {
listFilter.add(CardName); listFilter.add(CardName);
} }
@@ -119,7 +129,7 @@ public class CardFilter {
if (name == "red") { if (name == "red") {
for (int i = 0; i < all.size(); i++) { for (int i = 0; i < all.size(); i++) {
CardName = all.getCard(i); CardName = all.getCard(i);
if (CardUtil.getColors(CardName).contains(Constant.Color.Red) == false) { if (!CardUtil.getColors(CardName).contains(Constant.Color.Red)) {
listFilter.add(CardName); listFilter.add(CardName);
} }
@@ -129,7 +139,7 @@ public class CardFilter {
if (name == "white") { if (name == "white") {
for (int i = 0; i < all.size(); i++) { for (int i = 0; i < all.size(); i++) {
CardName = all.getCard(i); CardName = all.getCard(i);
if (CardUtil.getColors(CardName).contains(Constant.Color.White) == false) { if (!CardUtil.getColors(CardName).contains(Constant.Color.White)) {
listFilter.add(CardName); listFilter.add(CardName);
} }
@@ -139,7 +149,7 @@ public class CardFilter {
if (name.equals("colorless")) { if (name.equals("colorless")) {
for (int i = 0; i < all.size(); i++) { for (int i = 0; i < all.size(); i++) {
CardName = all.getCard(i); CardName = all.getCard(i);
if (CardUtil.getColors(CardName).contains(Constant.Color.Colorless) == false) { if (!CardUtil.getColors(CardName).contains(Constant.Color.Colorless)) {
listFilter.add(CardName); listFilter.add(CardName);
} }
@@ -150,22 +160,26 @@ public class CardFilter {
} }
/** /**
* <p>CardListTypeFilter.</p> * <p>
* CardListTypeFilter.
* </p>
* *
* TODO style: rename this method so it starts with a lowercase letter * TODO style: rename this method so it starts with a lowercase letter
* *
* @param all a {@link forge.CardList} object. * @param all
* @param name a {@link java.lang.String} object. * a {@link forge.CardList} object.
* @param name
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public CardList CardListTypeFilter(CardList all, String name) { public final CardList CardListTypeFilter(CardList all, String name) {
Card CardName = new Card(); Card CardName = new Card();
CardList listFilter = new CardList(); CardList listFilter = new CardList();
if (name == "artifact") { if (name == "artifact") {
for (int i = 0; i < all.size(); i++) { for (int i = 0; i < all.size(); i++) {
CardName = all.getCard(i); CardName = all.getCard(i);
if (CardName.isArtifact() == false) { if (!CardName.isArtifact()) {
listFilter.add(CardName); listFilter.add(CardName);
} }
@@ -175,7 +189,7 @@ public class CardFilter {
if (name == "creature") { if (name == "creature") {
for (int i = 0; i < all.size(); i++) { for (int i = 0; i < all.size(); i++) {
CardName = all.getCard(i); CardName = all.getCard(i);
if (CardName.isCreature() == false) { if (!CardName.isCreature()) {
listFilter.add(CardName); listFilter.add(CardName);
} }
@@ -185,7 +199,7 @@ public class CardFilter {
if (name == "enchantment") { if (name == "enchantment") {
for (int i = 0; i < all.size(); i++) { for (int i = 0; i < all.size(); i++) {
CardName = all.getCard(i); CardName = all.getCard(i);
if (CardName.isEnchantment() == false) { if (!CardName.isEnchantment()) {
listFilter.add(CardName); listFilter.add(CardName);
} }
@@ -195,7 +209,7 @@ public class CardFilter {
if (name == "instant") { if (name == "instant") {
for (int i = 0; i < all.size(); i++) { for (int i = 0; i < all.size(); i++) {
CardName = all.getCard(i); CardName = all.getCard(i);
if (CardName.isInstant() == false) { if (!CardName.isInstant()) {
listFilter.add(CardName); listFilter.add(CardName);
} }
@@ -205,7 +219,7 @@ public class CardFilter {
if (name == "land") { if (name == "land") {
for (int i = 0; i < all.size(); i++) { for (int i = 0; i < all.size(); i++) {
CardName = all.getCard(i); CardName = all.getCard(i);
if (CardName.isLand() == false) { if (!CardName.isLand()) {
listFilter.add(CardName); listFilter.add(CardName);
} }
@@ -215,7 +229,7 @@ public class CardFilter {
if (name == "planeswalker") { if (name == "planeswalker") {
for (int i = 0; i < all.size(); i++) { for (int i = 0; i < all.size(); i++) {
CardName = all.getCard(i); CardName = all.getCard(i);
if (CardName.isPlaneswalker() == false) { if (!CardName.isPlaneswalker()) {
listFilter.add(CardName); listFilter.add(CardName);
} }
@@ -225,7 +239,7 @@ public class CardFilter {
if (name.equals("sorcery")) { if (name.equals("sorcery")) {
for (int i = 0; i < all.size(); i++) { for (int i = 0; i < all.size(); i++) {
CardName = all.getCard(i); CardName = all.getCard(i);
if (CardName.isSorcery() == false) { if (!CardName.isSorcery()) {
listFilter.add(CardName); listFilter.add(CardName);
} }
@@ -235,100 +249,104 @@ public class CardFilter {
return listFilter; return listFilter;
} }
/**
* Filter an iterable sequence of Cards; note this is a static method that
* is very similar to the non-static one.
*
* @param iterable
* the sequence of cards to examine
*
* @param filt
* determines which cards are present in the resulting list
*
* @return a list of Cards that meet the filtering criteria; may be empty,
* but never null
*/
public static CardList filter(final Iterable<Card> iterable, final CardListFilter filt) {
CardList result = new CardList();
for (Card card : iterable) {
if (filt.addCard(card)) {
result.add(card);
}
}
/** return result;
* Filter an iterable sequence of Cards; note this is a static method }
* that is very similar to the non-static one.
*
* @param iterable the sequence of cards to examine
*
* @param filt determines which cards are present in the resulting list
*
* @return a list of Cards that meet the filtering criteria; may be empty,
* but never null
*/
public static CardList filter(final Iterable<Card> iterable, final CardListFilter filt) {
CardList result = new CardList();
for (Card card : iterable) {
if (filt.addCard(card)) {
result.add(card);
}
}
return result;
}
/**
* Filter a Generator of Cards based on their colors; this does not cause
* the generator to be evaluated, but rather defers the filtering to when
* the result's generate method is called (e.g., by YieldUtils.toIterable).
*
* @param inputGenerator the sequence to filter; must not be null
*
* @param cardColor
* a {@link java.lang.String} object; "Multicolor" is also
* accepted. Must not be null.
*
* @return a new Generator containing cards only of the desired color or
* multicolored cards.
*/
public static Generator<Card> getColor(final Generator<Card> inputGenerator, final String cardColor) {
UtilFunctions.checkNotNull("inputGenerator", inputGenerator);
UtilFunctions.checkNotNull("cardColor", cardColor);
final boolean weWantMulticolor = cardColor.equals("Multicolor");
Lambda1<Boolean, Card> predicate = new Lambda1<Boolean, Card>() {
public Boolean apply(final Card c) {
if (c == null) {
return false;
}
if (weWantMulticolor && c.getColor() != null && c.getColor().size() > 1) {
return true;
}
else if (c.isColor(cardColor) && c.getColor() != null && c.getColor().size() == 1) {
return true;
}
return false;
}
};
return GeneratorFunctions.filterGenerator(predicate, inputGenerator);
} //getColor()
/** /**
* Filter a Generator of cards so that it contains only the ones that exist in certain sets. * Filter a Generator of Cards based on their colors; this does not cause
* * the generator to be evaluated, but rather defers the filtering to when
* @param inputGenerator a sequence Generator of Card instances; must not be null. * the result's generate method is called (e.g., by YieldUtils.toIterable).
* *
* @param sets an ArrayList of Strings identifying the valid sets; must not be null. * @param inputGenerator
* * the sequence to filter; must not be null
* @return a {@link forge.CardList} object. *
*/ * @param cardColor
public static Generator<Card> getSets(final Generator<Card> inputGenerator, final List<String> sets) * a {@link java.lang.String} object; "Multicolor" is also
{ * accepted. Must not be null.
UtilFunctions.checkNotNull("inputGenerator", inputGenerator); *
UtilFunctions.checkNotNull("sets", sets); * @return a new Generator containing cards only of the desired color or
* multicolored cards.
*/
public static Generator<Card> getColor(final Generator<Card> inputGenerator, final String cardColor) {
UtilFunctions.checkNotNull("inputGenerator", inputGenerator);
UtilFunctions.checkNotNull("cardColor", cardColor);
Lambda1<Boolean, Card> predicate = new Lambda1<Boolean, Card>() { final boolean weWantMulticolor = cardColor.equals("Multicolor");
public Boolean apply(final Card c) {
if (c == null) {
return false;
}
for (SetInfo set : c.getSets()) { Lambda1<Boolean, Card> predicate = new Lambda1<Boolean, Card>() {
if (set != null && sets.contains(set.toString())) { public Boolean apply(final Card c) {
return true; if (c == null) {
} return false;
} }
return false; if (weWantMulticolor && c.getColor() != null && c.getColor().size() > 1) {
} return true;
}; } else if (c.isColor(cardColor) && c.getColor() != null && c.getColor().size() == 1) {
return true;
}
return GeneratorFunctions.filterGenerator(predicate, inputGenerator); return false;
} //getSets(Generator,ArrayList) }
};
return GeneratorFunctions.filterGenerator(predicate, inputGenerator);
} // getColor()
/**
* Filter a Generator of cards so that it contains only the ones that exist
* in certain sets.
*
* @param inputGenerator
* a sequence Generator of Card instances; must not be null.
*
* @param sets
* an ArrayList of Strings identifying the valid sets; must not
* be null.
*
* @return a {@link forge.CardList} object.
*/
public static Generator<Card> getSets(final Generator<Card> inputGenerator, final List<String> sets) {
UtilFunctions.checkNotNull("inputGenerator", inputGenerator);
UtilFunctions.checkNotNull("sets", sets);
Lambda1<Boolean, Card> predicate = new Lambda1<Boolean, Card>() {
public Boolean apply(final Card c) {
if (c == null) {
return false;
}
for (SetInfo set : c.getSets()) {
if (set != null && sets.contains(set.toString())) {
return true;
}
}
return false;
}
};
return GeneratorFunctions.filterGenerator(predicate, inputGenerator);
} // getSets(Generator,ArrayList)
} }

View File

@@ -1,19 +1,20 @@
package forge; package forge;
import com.google.code.jyield.Generator;
import com.google.code.jyield.Yieldable;
import forge.card.cardFactory.CardFactoryUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import com.google.code.jyield.Generator;
import com.google.code.jyield.Yieldable;
import forge.card.cardFactory.CardFactoryUtil;
/** /**
* <p>CardList class.</p> * <p>
* CardList class.
* </p>
* *
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
@@ -21,7 +22,9 @@ import java.util.List;
public class CardList implements Iterable<Card> { public class CardList implements Iterable<Card> {
/** /**
* <p>iterator.</p> * <p>
* iterator.
* </p>
* *
* @return a {@link java.util.Iterator} object. * @return a {@link java.util.Iterator} object.
*/ */
@@ -32,24 +35,32 @@ public class CardList implements Iterable<Card> {
private ArrayList<Card> list = new ArrayList<Card>(); private ArrayList<Card> list = new ArrayList<Card>();
/** /**
* <p>Constructor for CardList.</p> * <p>
* Constructor for CardList.
* </p>
*/ */
public CardList() { public CardList() {
} }
/** /**
* <p>Constructor for CardList.</p> * <p>
* Constructor for CardList.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
*/ */
public CardList(final Card... c) { public CardList(final Card... c) {
addAll(c); addAll(c);
} }
/** /**
* <p>Constructor for CardList.</p> * <p>
* Constructor for CardList.
* </p>
* *
* @param al a {@link java.util.ArrayList} object. * @param al
* a {@link java.util.ArrayList} object.
*/ */
public CardList(final List<Card> al) { public CardList(final List<Card> al) {
addAll(al.toArray()); addAll(al.toArray());
@@ -59,8 +70,8 @@ public class CardList implements Iterable<Card> {
* Make a shallow copy of an Iterable's contents; this could be another * Make a shallow copy of an Iterable's contents; this could be another
* CardList. * CardList.
* *
* @param iterable we traverse this and copy its contents into a local * @param iterable
* field. * we traverse this and copy its contents into a local field.
*/ */
public CardList(final Iterable<Card> iterable) { public CardList(final Iterable<Card> iterable) {
for (Card card : iterable) { for (Card card : iterable) {
@@ -69,9 +80,12 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>Constructor for CardList.</p> * <p>
* Constructor for CardList.
* </p>
* *
* @param c an array of {@link java.lang.Object} objects. * @param c
* an array of {@link java.lang.Object} objects.
*/ */
public CardList(final Object[] c) { public CardList(final Object[] c) {
addAll(c); addAll(c);
@@ -82,10 +96,11 @@ public class CardList implements Iterable<Card> {
* *
* We ignore null values produced by the generator. * We ignore null values produced by the generator.
* *
* @param generator a non-infinite generator of Card instances. * @param generator
* a non-infinite generator of Card instances.
*/ */
public CardList(final Generator<Card> generator) { public CardList(final Generator<Card> generator) {
// Generators yield their contents to a Yieldable. Here, // Generators yield their contents to a Yieldable. Here,
// we create a quick Yieldable that adds the information it // we create a quick Yieldable that adds the information it
// receives to this CardList's list field. // receives to this CardList's list field.
@@ -104,16 +119,20 @@ public class CardList implements Iterable<Card> {
/** /**
* Create a cardlist with an initial estimate of its maximum size. * Create a cardlist with an initial estimate of its maximum size.
* *
* @param size an initialize estimate of its maximum size * @param size
* an initialize estimate of its maximum size
*/ */
public CardList(final int size) { public CardList(final int size) {
list = new ArrayList<Card>(size); list = new ArrayList<Card>(size);
} }
/** /**
* <p>Get any cards that exist in the passed in sets list.</p> * <p>
* Get any cards that exist in the passed in sets list.
* </p>
* *
* @param sets a {@link java.util.ArrayList} object. * @param sets
* a {@link java.util.ArrayList} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getSets(final ArrayList<String> sets) { public final CardList getSets(final ArrayList<String> sets) {
@@ -128,13 +147,15 @@ public class CardList implements Iterable<Card> {
} }
return list; return list;
} //getSets() } // getSets()
/** /**
* <p>getColor.</p> * <p>
* getColor.
* </p>
* *
* @param cardColor a {@link java.lang.String} object. * @param cardColor
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getColor(final String cardColor) { public final CardList getColor(final String cardColor) {
@@ -148,13 +169,17 @@ public class CardList implements Iterable<Card> {
} }
return list; return list;
} //getColor() } // getColor()
/** /**
* <p>getOnly2Colors.</p> * <p>
* getOnly2Colors.
* </p>
* *
* @param clr1 a {@link java.lang.String} object. * @param clr1
* @param clr2 a {@link java.lang.String} object. * a {@link java.lang.String} object.
* @param clr2
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getOnly2Colors(final String clr1, final String clr2) { public final CardList getOnly2Colors(final String clr1, final String clr2) {
@@ -166,8 +191,7 @@ public class CardList implements Iterable<Card> {
ArrayList<Card_Color> cClrs = c.getColor(); ArrayList<Card_Color> cClrs = c.getColor();
for (int i = 0; i < cClrs.size(); i++) { for (int i = 0; i < cClrs.size(); i++) {
if (!cClrs.get(i).toStringArray().get(0).equals(clr1) if (!cClrs.get(i).toStringArray().get(0).equals(clr1)
&& !cClrs.get(i).toStringArray().get(0).equals(clr2)) && !cClrs.get(i).toStringArray().get(0).equals(clr2)) {
{
return false; return false;
} }
} }
@@ -179,7 +203,9 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>reverse.</p> * <p>
* reverse.
* </p>
*/ */
public final void reverse() { public final void reverse() {
Collections.reverse(list); Collections.reverse(list);
@@ -205,11 +231,14 @@ public class CardList implements Iterable<Card> {
} }
} }
//removes one copy of that card // removes one copy of that card
/** /**
* <p>remove.</p> * <p>
* remove.
* </p>
* *
* @param cardName a {@link java.lang.String} object. * @param cardName
* a {@link java.lang.String} object.
*/ */
public final void remove(final String cardName) { public final void remove(final String cardName) {
CardList find = this.filter(new CardListFilter() { CardList find = this.filter(new CardListFilter() {
@@ -221,14 +250,16 @@ public class CardList implements Iterable<Card> {
if (0 < find.size()) { if (0 < find.size()) {
this.remove(find.get(0)); this.remove(find.get(0));
} else { } else {
throw new RuntimeException("CardList : remove(String cardname), error - card name not found: " throw new RuntimeException("CardList : remove(String cardname), error - card name not found: " + cardName
+ cardName + " - contents of Arraylist:" + list); + " - contents of Arraylist:" + list);
} }
} //remove(String cardName) } // remove(String cardName)
/** /**
* <p>size.</p> * <p>
* size.
* </p>
* *
* @return a int. * @return a int.
*/ */
@@ -237,19 +268,26 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>add.</p> * <p>
* add.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
*/ */
public final void add(final Card c) { public final void add(final Card c) {
list.add(c); list.add(c);
} }
/** /**
* <p>add.</p> * <p>
* add.
* </p>
* *
* @param n a int. * @param n
* @param c a {@link forge.Card} object. * a int.
* @param c
* a {@link forge.Card} object.
*/ */
public final void add(final int n, final Card c) { public final void add(final int n, final Card c) {
list.add(n, c); list.add(n, c);
@@ -258,16 +296,20 @@ public class CardList implements Iterable<Card> {
/** /**
* addAll(CardList) - lets you add one CardList to another directly. * addAll(CardList) - lets you add one CardList to another directly.
* *
* @param in - CardList to add to the current CardList * @param in
* - CardList to add to the current CardList
*/ */
public final void addAll(final CardList in) { public final void addAll(final CardList in) {
addAll(in.toArray()); addAll(in.toArray());
} }
/** /**
* <p>addAll.</p> * <p>
* addAll.
* </p>
* *
* @param c an array of {@link java.lang.Object} objects. * @param c
* an array of {@link java.lang.Object} objects.
*/ */
public final void addAll(final Object[] c) { public final void addAll(final Object[] c) {
for (int i = 0; i < c.length; i++) { for (int i = 0; i < c.length; i++) {
@@ -276,20 +318,26 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>contains.</p> * <p>
* contains.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
* @return a boolean. * @return a boolean.
*/ */
public final boolean contains(final Card c) { public final boolean contains(final Card c) {
return list.contains(c); return list.contains(c);
} }
//probably remove getCard() in the future // probably remove getCard() in the future
/** /**
* <p>getCard.</p> * <p>
* getCard.
* </p>
* *
* @param index a int. * @param index
* a int.
* @return a {@link forge.Card} object. * @return a {@link forge.Card} object.
*/ */
public final Card getCard(final int index) { public final Card getCard(final int index) {
@@ -297,9 +345,12 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>get.</p> * <p>
* get.
* </p>
* *
* @param i a int. * @param i
* a int.
* @return a {@link forge.Card} object. * @return a {@link forge.Card} object.
*/ */
public final Card get(final int i) { public final Card get(final int i) {
@@ -307,9 +358,12 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>containsName.</p> * <p>
* containsName.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
* @return a boolean. * @return a boolean.
*/ */
public final boolean containsName(final Card c) { public final boolean containsName(final Card c) {
@@ -317,9 +371,12 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>containsName.</p> * <p>
* containsName.
* </p>
* *
* @param name a {@link java.lang.String} object. * @param name
* a {@link java.lang.String} object.
* @return a boolean. * @return a boolean.
*/ */
public final boolean containsName(final String name) { public final boolean containsName(final String name) {
@@ -332,11 +389,14 @@ public class CardList implements Iterable<Card> {
return false; return false;
} }
//returns new subset of all the cards with the same name // returns new subset of all the cards with the same name
/** /**
* <p>getName.</p> * <p>
* getName.
* </p>
* *
* @param name a {@link java.lang.String} object. * @param name
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getName(final String name) { public final CardList getName(final String name) {
@@ -351,11 +411,14 @@ public class CardList implements Iterable<Card> {
return c; return c;
} }
//returns new subset of all the cards that have a different name // returns new subset of all the cards that have a different name
/** /**
* <p>getNotName.</p> * <p>
* getNotName.
* </p>
* *
* @param name a {@link java.lang.String} object. * @param name
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getNotName(final String name) { public final CardList getNotName(final String name) {
@@ -371,9 +434,12 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>getImageName.</p> * <p>
* getImageName.
* </p>
* *
* @param name a {@link java.lang.String} object. * @param name
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getImageName(final String name) { public final CardList getImageName(final String name) {
@@ -389,9 +455,12 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>getController.</p> * <p>
* getController.
* </p>
* *
* @param player a {@link forge.Player} object. * @param player
* a {@link forge.Player} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getController(final Player player) { public final CardList getController(final Player player) {
@@ -403,9 +472,12 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>getOwner.</p> * <p>
* getOwner.
* </p>
* *
* @param player a {@link forge.Player} object. * @param player
* a {@link forge.Player} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getOwner(final Player player) { public final CardList getOwner(final Player player) {
@@ -416,11 +488,15 @@ public class CardList implements Iterable<Card> {
}); });
} }
//cardType is like "Land" or "Goblin", returns a new CardList that is a subset of current CardList // cardType is like "Land" or "Goblin", returns a new CardList that is a
// subset of current CardList
/** /**
* <p>getType.</p> * <p>
* getType.
* </p>
* *
* @param cardType a {@link java.lang.String} object. * @param cardType
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getType(final String cardType) { public final CardList getType(final String cardType) {
@@ -431,11 +507,15 @@ public class CardList implements Iterable<Card> {
}); });
} }
//cardType is like "Land" or "Goblin", returns a new CardList with cards that do not have this type // cardType is like "Land" or "Goblin", returns a new CardList with cards
// that do not have this type
/** /**
* <p>getNotType.</p> * <p>
* getNotType.
* </p>
* *
* @param cardType a {@link java.lang.String} object. * @param cardType
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getNotType(final String cardType) { public final CardList getNotType(final String cardType) {
@@ -447,7 +527,9 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>getPermanents.</p> * <p>
* getPermanents.
* </p>
* *
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
@@ -460,9 +542,12 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>getKeyword.</p> * <p>
* getKeyword.
* </p>
* *
* @param keyword a {@link java.lang.String} object. * @param keyword
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getKeyword(final String keyword) { public final CardList getKeyword(final String keyword) {
@@ -474,9 +559,12 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>getNotKeyword.</p> * <p>
* getNotKeyword.
* </p>
* *
* @param keyword a {@link java.lang.String} object. * @param keyword
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getNotKeyword(final String keyword) { public final CardList getNotKeyword(final String keyword) {
@@ -487,11 +575,14 @@ public class CardList implements Iterable<Card> {
}); });
} }
//get all cards that have this string in their keywords // get all cards that have this string in their keywords
/** /**
* <p>getKeywordsContain.</p> * <p>
* getKeywordsContain.
* </p>
* *
* @param keyword a {@link java.lang.String} object. * @param keyword
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getKeywordsContain(final String keyword) { public final CardList getKeywordsContain(final String keyword) {
@@ -502,11 +593,14 @@ public class CardList implements Iterable<Card> {
}); });
} }
//get all cards that don't have this string in their keywords // get all cards that don't have this string in their keywords
/** /**
* <p>getKeywordsDontContain.</p> * <p>
* getKeywordsDontContain.
* </p>
* *
* @param keyword a {@link java.lang.String} object. * @param keyword
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getKeywordsDontContain(final String keyword) { public final CardList getKeywordsDontContain(final String keyword) {
@@ -518,7 +612,9 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>getTokens.</p> * <p>
* getTokens.
* </p>
* *
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
@@ -533,17 +629,20 @@ public class CardList implements Iterable<Card> {
/** /**
* Create a new list of cards by applying a filter to this one. * Create a new list of cards by applying a filter to this one.
* *
* @param filt determines which cards are present in the resulting list * @param filt
* determines which cards are present in the resulting list
* *
* @return a subset of this CardList whose items meet the filtering * @return a subset of this CardList whose items meet the filtering
* criteria; may be empty, but never null. * criteria; may be empty, but never null.
*/ */
public final CardList filter(final CardListFilter filt) { public final CardList filter(final CardListFilter filt) {
return CardFilter.filter(this, filt); return CardFilter.filter(this, filt);
} }
/** /**
* <p>toArray.</p> * <p>
* toArray.
* </p>
* *
* @return an array of {@link forge.Card} objects. * @return an array of {@link forge.Card} objects.
*/ */
@@ -560,7 +659,9 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>isEmpty.</p> * <p>
* isEmpty.
* </p>
* *
* @return a boolean. * @return a boolean.
*/ */
@@ -569,9 +670,12 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>remove.</p> * <p>
* remove.
* </p>
* *
* @param i a int. * @param i
* a int.
* @return a {@link forge.Card} object. * @return a {@link forge.Card} object.
*/ */
public final Card remove(final int i) { public final Card remove(final int i) {
@@ -579,18 +683,24 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>remove.</p> * <p>
* remove.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
*/ */
public final void remove(final Card c) { public final void remove(final Card c) {
list.remove(c); list.remove(c);
} }
/** /**
* <p>removeAll.</p> * <p>
* removeAll.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
*/ */
public final void removeAll(final Card c) { public final void removeAll(final Card c) {
ArrayList<Card> cList = new ArrayList<Card>(); ArrayList<Card> cList = new ArrayList<Card>();
@@ -599,36 +709,46 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>clear.</p> * <p>
* clear.
* </p>
*/ */
public final void clear() { public final void clear() {
list.clear(); list.clear();
} }
/** /**
* <p>shuffle.</p> * <p>
* shuffle.
* </p>
*/ */
public final void shuffle() { public final void shuffle() {
// reseed Random each time we want to Shuffle // reseed Random each time we want to Shuffle
//MyRandom.random = MyRandom.random; // MyRandom.random = MyRandom.random;
Collections.shuffle(list, MyRandom.random); Collections.shuffle(list, MyRandom.random);
Collections.shuffle(list, MyRandom.random); Collections.shuffle(list, MyRandom.random);
Collections.shuffle(list, MyRandom.random); Collections.shuffle(list, MyRandom.random);
} }
/** /**
* <p>sort.</p> * <p>
* sort.
* </p>
* *
* @param c a {@link java.util.Comparator} object. * @param c
* a {@link java.util.Comparator} object.
*/ */
public final void sort(final Comparator<Card> c) { public final void sort(final Comparator<Card> c) {
Collections.sort(list, c); Collections.sort(list, c);
} }
/** /**
* <p>getTargetableCards.</p> * <p>
* getTargetableCards.
* </p>
* *
* @param source a {@link forge.Card} object. * @param source
* a {@link forge.Card} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getTargetableCards(final Card source) { public final CardList getTargetableCards(final Card source) {
@@ -640,25 +760,33 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>getUnprotectedCards.</p> * <p>
* getUnprotectedCards.
* </p>
* *
* @param source a {@link forge.Card} object. * @param source
* a {@link forge.Card} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getUnprotectedCards(final Card source) { public final CardList getUnprotectedCards(final Card source) {
return this.filter(new CardListFilter() { return this.filter(new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return !CardFactoryUtil.hasProtectionFrom(source, c); return !CardFactoryUtil.hasProtectionFrom(source, c);
} }
}); });
} }
/** /**
* <p>getValidCards.</p> * <p>
* getValidCards.
* </p>
* *
* @param restrictions a {@link java.lang.String} object. * @param restrictions
* @param sourceController a {@link forge.Player} object. * a {@link java.lang.String} object.
* @param source a {@link forge.Card} object. * @param sourceController
* a {@link forge.Player} object.
* @param source
* a {@link forge.Card} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getValidCards(final String restrictions, final Player sourceController, final Card source) { public final CardList getValidCards(final String restrictions, final Player sourceController, final Card source) {
@@ -666,11 +794,16 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>getValidCards.</p> * <p>
* getValidCards.
* </p>
* *
* @param restrictions a {@link java.lang.String} object. * @param restrictions
* @param sourceController a {@link forge.Player} object. * a {@link java.lang.String} object.
* @param source a {@link forge.Card} object. * @param sourceController
* a {@link forge.Player} object.
* @param source
* a {@link forge.Card} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getValidCards(final String[] restrictions, final Player sourceController, final Card source) { public final CardList getValidCards(final String[] restrictions, final Player sourceController, final Card source) {
@@ -682,35 +815,41 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>getEquipMagnets.</p> * <p>
* getEquipMagnets.
* </p>
* *
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getEquipMagnets() { public final CardList getEquipMagnets() {
return this.filter(new CardListFilter() { return this.filter(new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return (c.isCreature() && (c.getSVar("EquipMe").equals("Multiple") return (c.isCreature() && (c.getSVar("EquipMe").equals("Multiple") || (c.getSVar("EquipMe").equals(
|| (c.getSVar("EquipMe").equals("Once") && !c.isEquipped()))); "Once") && !c.isEquipped())));
} }
}); });
} }
/** /**
* <p>getEnchantMagnets.</p> * <p>
* getEnchantMagnets.
* </p>
* *
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getEnchantMagnets() { public final CardList getEnchantMagnets() {
return this.filter(new CardListFilter() { return this.filter(new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return (c.isCreature() && (c.getSVar("EnchantMe").equals("Multiple") return (c.isCreature() && (c.getSVar("EnchantMe").equals("Multiple") || (c.getSVar("EnchantMe").equals(
|| (c.getSVar("EnchantMe").equals("Once") && !c.isEnchanted()))); "Once") && !c.isEnchanted())));
} }
}); });
} }
/** /**
* <p>getTotalConvertedManaCost.</p> * <p>
* getTotalConvertedManaCost.
* </p>
* *
* @return a int. * @return a int.
*/ */
@@ -724,7 +863,9 @@ public class CardList implements Iterable<Card> {
/** /**
* *
* <p>getTotalCreaturePower.</p> * <p>
* getTotalCreaturePower.
* </p>
* *
* @return a int. * @return a int.
*/ */
@@ -738,7 +879,9 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>getHighestConvertedManaCost.</p> * <p>
* getHighestConvertedManaCost.
* </p>
* *
* @return a int. * @return a int.
* @since 1.0.15 * @since 1.0.15
@@ -752,7 +895,9 @@ public class CardList implements Iterable<Card> {
} }
/** /**
* <p>getColored.</p> * <p>
* getColored.
* </p>
* *
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
@@ -767,8 +912,10 @@ public class CardList implements Iterable<Card> {
/** /**
* getAbove. * getAbove.
* *
* @param source a Card object * @param source
* @param compared a Card object * a Card object
* @param compared
* a Card object
* @return a boolean * @return a boolean
*/ */
public final boolean getAbove(final Card source, final Card compared) { public final boolean getAbove(final Card source, final Card compared) {
@@ -789,8 +936,10 @@ public class CardList implements Iterable<Card> {
/** /**
* getDirectlyAbove. * getDirectlyAbove.
* *
* @param source a Card object * @param source
* @param compared a Card object * a Card object
* @param compared
* a Card object
* @return a boolean * @return a boolean
*/ */
public final boolean getDirectlyAbove(final Card source, final Card compared) { public final boolean getDirectlyAbove(final Card source, final Card compared) {
@@ -805,8 +954,7 @@ public class CardList implements Iterable<Card> {
return true; return true;
} }
return false; return false;
} } else if (itr.equals(source)) {
else if (itr.equals(source)) {
checkNext = true; checkNext = true;
} else if (itr.equals(compared)) { } else if (itr.equals(compared)) {
return false; return false;
@@ -815,4 +963,4 @@ public class CardList implements Iterable<Card> {
return false; return false;
} }
} //end class CardList } // end class CardList

View File

@@ -1,16 +1,21 @@
package forge; package forge;
/** /**
* <p>CardListFilter interface.</p> * <p>
* CardListFilter interface.
* </p>
* *
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
public interface CardListFilter { public interface CardListFilter {
/** /**
* <p>addCard.</p> * <p>
* addCard.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
* @return a boolean. * @return a boolean.
*/ */
boolean addCard(Card c); boolean addCard(Card c);
@@ -18,7 +23,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all cards that are tapped. * a CardListFilter to get all cards that are tapped.
*/ */
public static final CardListFilter tapped = new CardListFilter() { CardListFilter tapped = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return c.isTapped(); return c.isTapped();
} }
@@ -27,7 +32,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all cards that are untapped. * a CardListFilter to get all cards that are untapped.
*/ */
public static final CardListFilter untapped = new CardListFilter() { CardListFilter untapped = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return c.isUntapped(); return c.isUntapped();
} }
@@ -36,7 +41,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all creatures. * a CardListFilter to get all creatures.
*/ */
public static final CardListFilter creatures = new CardListFilter() { CardListFilter creatures = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return c.isCreature(); return c.isCreature();
} }
@@ -45,7 +50,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all enchantments. * a CardListFilter to get all enchantments.
*/ */
public static final CardListFilter enchantments = new CardListFilter() { CardListFilter enchantments = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return c.isEnchantment(); return c.isEnchantment();
} }
@@ -54,7 +59,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all equipment. * a CardListFilter to get all equipment.
*/ */
public static final CardListFilter equipment = new CardListFilter() { CardListFilter equipment = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return c.isEquipment(); return c.isEquipment();
} }
@@ -63,7 +68,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all unenchanted cards in a list. * a CardListFilter to get all unenchanted cards in a list.
*/ */
public static final CardListFilter unenchanted = new CardListFilter() { CardListFilter unenchanted = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return !c.isEnchanted(); return !c.isEnchanted();
} }
@@ -72,7 +77,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all enchanted cards in a list. * a CardListFilter to get all enchanted cards in a list.
*/ */
public static final CardListFilter enchanted = new CardListFilter() { CardListFilter enchanted = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return c.isEnchanted(); return c.isEnchanted();
} }
@@ -81,7 +86,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all nontoken cards. * a CardListFilter to get all nontoken cards.
*/ */
public static final CardListFilter nonToken = new CardListFilter() { CardListFilter nonToken = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return !c.isToken(); return !c.isToken();
} }
@@ -90,7 +95,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all token cards. * a CardListFilter to get all token cards.
*/ */
public static final CardListFilter token = new CardListFilter() { CardListFilter token = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return c.isToken(); return c.isToken();
} }
@@ -99,7 +104,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all nonbasic lands. * a CardListFilter to get all nonbasic lands.
*/ */
public static final CardListFilter nonBasicLand = new CardListFilter() { CardListFilter nonBasicLand = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return !c.isBasicLand(); return !c.isBasicLand();
} }
@@ -108,9 +113,9 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all basicLands. * a CardListFilter to get all basicLands.
*/ */
public static final CardListFilter basicLands = new CardListFilter() { CardListFilter basicLands = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
//the isBasicLand() check here may be sufficient... // the isBasicLand() check here may be sufficient...
return c.isLand() && c.isBasicLand(); return c.isLand() && c.isBasicLand();
} }
}; };
@@ -118,7 +123,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all artifacts. * a CardListFilter to get all artifacts.
*/ */
public static final CardListFilter artifacts = new CardListFilter() { CardListFilter artifacts = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return c.isArtifact(); return c.isArtifact();
} }
@@ -127,7 +132,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all nonartifacts. * a CardListFilter to get all nonartifacts.
*/ */
public static final CardListFilter nonartifacts = new CardListFilter() { CardListFilter nonartifacts = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return !c.isArtifact(); return !c.isArtifact();
} }
@@ -136,7 +141,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all lands. * a CardListFilter to get all lands.
*/ */
public static final CardListFilter lands = new CardListFilter() { CardListFilter lands = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return c.isLand(); return c.isLand();
} }
@@ -145,17 +150,16 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all nonlands. * a CardListFilter to get all nonlands.
*/ */
public static final CardListFilter nonlands = new CardListFilter() { CardListFilter nonlands = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return !c.isLand(); return !c.isLand();
} }
}; };
/** /**
* a CardListFilter to get all cards that are black. * a CardListFilter to get all cards that are black.
*/ */
public static final CardListFilter black = new CardListFilter() { CardListFilter black = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return c.isBlack(); return c.isBlack();
} }
@@ -164,7 +168,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all cards that are blue. * a CardListFilter to get all cards that are blue.
*/ */
public static final CardListFilter blue = new CardListFilter() { CardListFilter blue = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return c.isBlue(); return c.isBlue();
} }
@@ -173,7 +177,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all cards that are green. * a CardListFilter to get all cards that are green.
*/ */
public static final CardListFilter green = new CardListFilter() { CardListFilter green = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return c.isGreen(); return c.isGreen();
} }
@@ -182,7 +186,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all cards that are red. * a CardListFilter to get all cards that are red.
*/ */
public static final CardListFilter red = new CardListFilter() { CardListFilter red = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return c.isRed(); return c.isRed();
} }
@@ -191,7 +195,7 @@ public interface CardListFilter {
/** /**
* a CardListFilter to get all cards that are white. * a CardListFilter to get all cards that are white.
*/ */
public static final CardListFilter white = new CardListFilter() { CardListFilter white = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
return c.isWhite(); return c.isWhite();
} }

View File

@@ -1,183 +1,224 @@
package forge; package forge;
import com.esotericsoftware.minlog.Log;
import forge.card.cardFactory.CardFactoryUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import com.esotericsoftware.minlog.Log;
import forge.card.cardFactory.CardFactoryUtil;
/** /**
* <p>CardListUtil class.</p> * <p>
* CardListUtil class.
* </p>
* *
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
public class CardListUtil { public class CardListUtil {
/** /**
* <p>filterToughness.</p> * <p>
* filterToughness.
* </p>
* *
* @param in a {@link forge.CardList} object. * @param in
* @param atLeastToughness a int. * a {@link forge.CardList} object.
* @param atLeastToughness
* a int.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public static CardList filterToughness(CardList in, int atLeastToughness) { public static CardList filterToughness(final CardList in, final int atLeastToughness) {
CardList out = new CardList(); CardList out = new CardList();
for (int i = 0; i < in.size(); i++) for (int i = 0; i < in.size(); i++) {
if (in.get(i).getNetDefense() <= atLeastToughness) if (in.get(i).getNetDefense() <= atLeastToughness) {
out.add(in.get(i)); out.add(in.get(i));
}
}
return out; return out;
} }
//the higher the defense the better // the higher the defense the better
/** /**
* <p>sortDefense.</p> * <p>
* sortDefense.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* a {@link forge.CardList} object.
*/ */
public static void sortDefense(CardList list) { public static void sortDefense(final CardList list) {
Comparator<Card> com = new Comparator<Card>() { Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) { public int compare(final Card a, final Card b) {
return b.getNetDefense() - a.getNetDefense(); return b.getNetDefense() - a.getNetDefense();
} }
}; };
list.sort(com); list.sort(com);
}//sortDefense() } // sortDefense()
//the higher the attack the better // the higher the attack the better
/** /**
* <p>sortAttack.</p> * <p>
* sortAttack.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* a {@link forge.CardList} object.
*/ */
public static void sortAttack(CardList list) { public static void sortAttack(final CardList list) {
Comparator<Card> com = new Comparator<Card>() { Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) { public int compare(final Card a, final Card b) {
if (CombatUtil.isDoranInPlay()) if (CombatUtil.isDoranInPlay()) {
return b.getNetDefense() - a.getNetDefense(); return b.getNetDefense() - a.getNetDefense();
else } else {
return b.getNetAttack() - a.getNetAttack(); return b.getNetAttack() - a.getNetAttack();
}
} }
}; };
list.sort(com); list.sort(com);
}//sortAttack() } // sortAttack()
// sort by "best" using the EvaluateCreature function // sort by "best" using the EvaluateCreature function
// the best creatures will be first in the list // the best creatures will be first in the list
/** /**
* <p>sortByEvaluateCreature.</p> * <p>
* sortByEvaluateCreature.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* a {@link forge.CardList} object.
*/ */
public static void sortByEvaluateCreature(CardList list) { public static void sortByEvaluateCreature(final CardList list) {
Comparator<Card> com = new Comparator<Card>() { Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) { public int compare(final Card a, final Card b) {
return CardFactoryUtil.evaluateCreature(b) - CardFactoryUtil.evaluateCreature(a); return CardFactoryUtil.evaluateCreature(b) - CardFactoryUtil.evaluateCreature(a);
} }
}; };
list.sort(com); list.sort(com);
}//sortByEvaluateCreature() } // sortByEvaluateCreature()
// sort by "best" using the EvaluateCreature function // sort by "best" using the EvaluateCreature function
// the best creatures will be first in the list // the best creatures will be first in the list
/** /**
* <p>sortByMostExpensive.</p> * <p>
* sortByMostExpensive.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* a {@link forge.CardList} object.
*/ */
public static void sortByMostExpensive(CardList list) { public static void sortByMostExpensive(final CardList list) {
Comparator<Card> com = new Comparator<Card>() { Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) { public int compare(final Card a, final Card b) {
return b.getCMC() - a.getCMC(); return b.getCMC() - a.getCMC();
} }
}; };
list.sort(com); list.sort(com);
}//sortByEvaluateCreature() } // sortByEvaluateCreature()
//the lower the attack the better // the lower the attack the better
/** /**
* <p>sortAttackLowFirst.</p> * <p>
* sortAttackLowFirst.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* a {@link forge.CardList} object.
*/ */
public static void sortAttackLowFirst(CardList list) { public static void sortAttackLowFirst(final CardList list) {
Comparator<Card> com = new Comparator<Card>() { Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) { public int compare(final Card a, final Card b) {
if (CombatUtil.isDoranInPlay()) if (CombatUtil.isDoranInPlay()) {
return a.getNetDefense() - b.getNetDefense(); return a.getNetDefense() - b.getNetDefense();
else } else {
return a.getNetAttack() - b.getNetAttack(); return a.getNetAttack() - b.getNetAttack();
}
} }
}; };
list.sort(com); list.sort(com);
}//sortAttackLowFirst() } // sortAttackLowFirst()
/** /**
* <p>sortNonFlyingFirst.</p> * <p>
* sortNonFlyingFirst.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* a {@link forge.CardList} object.
*/ */
public static void sortNonFlyingFirst(CardList list) { public static void sortNonFlyingFirst(final CardList list) {
sortFlying(list); sortFlying(list);
list.reverse(); list.reverse();
}//sortNonFlyingFirst } // sortNonFlyingFirst
//the creature with flying are better // the creature with flying are better
/** /**
* <p>sortFlying.</p> * <p>
* sortFlying.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* a {@link forge.CardList} object.
*/ */
public static void sortFlying(CardList list) { public static void sortFlying(final CardList list) {
Comparator<Card> com = new Comparator<Card>() { Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) { public int compare(final Card a, final Card b) {
if (a.hasKeyword("Flying") && b.hasKeyword("Flying")) if (a.hasKeyword("Flying") && b.hasKeyword("Flying")) {
return 0; return 0;
else if (a.hasKeyword("Flying")) } else if (a.hasKeyword("Flying")) {
return -1; return -1;
else if (b.hasKeyword("Flying")) } else if (b.hasKeyword("Flying")) {
return 1; return 1;
}
return 0; return 0;
} }
}; };
list.sort(com); list.sort(com);
}//sortFlying() } // sortFlying()
//sort by keyword // sort by keyword
/** /**
* <p>sortByKeyword.</p> * <p>
* sortByKeyword.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* @param kw a {@link java.lang.String} object. * a {@link forge.CardList} object.
* @param kw
* a {@link java.lang.String} object.
*/ */
public static void sortByKeyword(CardList list, String kw) { public static void sortByKeyword(final CardList list, final String kw) {
final String keyword = kw; final String keyword = kw;
Comparator<Card> com = new Comparator<Card>() { Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) { public int compare(final Card a, final Card b) {
if (a.hasKeyword(keyword) && b.hasKeyword(keyword)) if (a.hasKeyword(keyword) && b.hasKeyword(keyword)) {
return 0; return 0;
else if (a.hasKeyword(keyword)) } else if (a.hasKeyword(keyword)) {
return -1; return -1;
else if (b.hasKeyword(keyword)) } else if (b.hasKeyword(keyword)) {
return 1; return 1;
}
return 0; return 0;
} }
}; };
list.sort(com); list.sort(com);
}//sortByKeyword() } // sortByKeyword()
/** /**
* <p>sortByDestroyEffect.</p> * <p>
* sortByDestroyEffect.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* a {@link forge.CardList} object.
*/ */
public static void sortByDestroyEffect(CardList list) { public static void sortByDestroyEffect(final CardList list) {
Comparator<Card> com = new Comparator<Card>() { Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) { public int compare(final Card a, final Card b) {
ArrayList<String> aKeywords = a.getKeyword(); ArrayList<String> aKeywords = a.getKeyword();
ArrayList<String> bKeywords = b.getKeyword(); ArrayList<String> bKeywords = b.getKeyword();
@@ -197,12 +238,13 @@ public class CardListUtil {
break; break;
} }
} }
if (aContains && bContains) if (aContains && bContains) {
return 0; return 0;
else if (aContains) } else if (aContains) {
return 1; return 1;
else if (bContains) } else if (bContains) {
return -1; return -1;
}
return 0; return 0;
} }
@@ -211,23 +253,27 @@ public class CardListUtil {
} }
/** /**
* <p>sortByIndestructible.</p> * <p>
* sortByIndestructible.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* a {@link forge.CardList} object.
*/ */
public static void sortByIndestructible(CardList list) { public static void sortByIndestructible(final CardList list) {
final ArrayList<String> arrList = new ArrayList<String>(); final ArrayList<String> arrList = new ArrayList<String>();
arrList.add("Timber Protector"); arrList.add("Timber Protector");
arrList.add("Eldrazi Monument"); arrList.add("Eldrazi Monument");
Comparator<Card> com = new Comparator<Card>() { Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) { public int compare(final Card a, final Card b) {
if (arrList.contains(a.getName()) && arrList.contains(b.getName())) if (arrList.contains(a.getName()) && arrList.contains(b.getName())) {
return 0; return 0;
else if (arrList.contains(a.getName())) } else if (arrList.contains(a.getName())) {
return 1; return 1;
else if (arrList.contains(b.getName())) } else if (arrList.contains(b.getName())) {
return -1; return -1;
}
return 0; return 0;
} }
@@ -236,20 +282,24 @@ public class CardListUtil {
} }
/** /**
* <p>sortByTapped.</p> * <p>
* sortByTapped.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* a {@link forge.CardList} object.
*/ */
public static void sortByTapped(CardList list) { public static void sortByTapped(final CardList list) {
Comparator<Card> com = new Comparator<Card>() { Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) { public int compare(final Card a, final Card b) {
if (a.isTapped() && b.isTapped()) if (a.isTapped() && b.isTapped()) {
return 0; return 0;
else if (a.isTapped()) } else if (a.isTapped()) {
return 1; return 1;
else if (b.isTapped()) } else if (b.isTapped()) {
return -1; return -1;
}
return 0; return 0;
} }
@@ -258,13 +308,16 @@ public class CardListUtil {
} }
/** /**
* <p>sortByName.</p> * <p>
* sortByName.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* a {@link forge.CardList} object.
*/ */
public static void sortByName(CardList list) { public static void sortByName(final CardList list) {
Comparator<Card> com = new Comparator<Card>() { Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) { public int compare(final Card a, final Card b) {
String aName = a.getName(); String aName = a.getName();
String bName = b.getName(); String bName = b.getName();
@@ -276,22 +329,26 @@ public class CardListUtil {
} }
/** /**
* <p>sortBySelectable.</p> * <p>
* sortBySelectable.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* @param type a {@link java.lang.String} object. * a {@link forge.CardList} object.
* @param type
* a {@link java.lang.String} object.
*/ */
public static void sortBySelectable(CardList list, String type) { public static void sortBySelectable(final CardList list, final String type) {
final String t = type; final String t = type;
Comparator<Card> com = new Comparator<Card>() { Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) { public int compare(final Card a, final Card b) {
if (a.isType(t) if (a.isType(t) && b.isType(t)) {
&& b.isType(t))
return 0; return 0;
else if (a.hasKeyword(t)) } else if (a.hasKeyword(t)) {
return 1; return 1;
else if (b.hasKeyword(t)) } else if (b.hasKeyword(t)) {
return -1; return -1;
}
return 0; return 0;
} }
@@ -300,22 +357,26 @@ public class CardListUtil {
} }
/** /**
* <p>sortByTextLen.</p> * <p>
* sortByTextLen.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* a {@link forge.CardList} object.
*/ */
public static void sortByTextLen(CardList list) { public static void sortByTextLen(final CardList list) {
Comparator<Card> com = new Comparator<Card>() { Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) { public int compare(final Card a, final Card b) {
int aLen = a.getText().length(); int aLen = a.getText().length();
int bLen = b.getText().length(); int bLen = b.getText().length();
if (aLen == bLen) if (aLen == bLen) {
return 0; return 0;
else if (aLen > bLen) } else if (aLen > bLen) {
return 1; return 1;
else if (bLen > aLen) } else if (bLen > aLen) {
return -1; return -1;
}
return 0; return 0;
} }
@@ -323,105 +384,129 @@ public class CardListUtil {
list.sort(com); list.sort(com);
} }
//Sorts from high to low // Sorts from high to low
/** /**
* <p>sortCMC.</p> * <p>
* sortCMC.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* a {@link forge.CardList} object.
*/ */
public static void sortCMC(CardList list) { public static void sortCMC(final CardList list) {
Comparator<Card> com = new Comparator<Card>() { Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) { public int compare(final Card a, final Card b) {
int cmcA = CardUtil.getConvertedManaCost(a.getManaCost()); int cmcA = CardUtil.getConvertedManaCost(a.getManaCost());
int cmcB = CardUtil.getConvertedManaCost(b.getManaCost()); int cmcB = CardUtil.getConvertedManaCost(b.getManaCost());
if (cmcA == cmcB) if (cmcA == cmcB) {
return 0; return 0;
if (cmcA > cmcB) }
if (cmcA > cmcB) {
return -1; return -1;
if (cmcB > cmcA) }
if (cmcB > cmcA) {
return 1; return 1;
}
return 0; return 0;
} }
}; };
list.sort(com); list.sort(com);
}//sortCMC } // sortCMC
/** /**
* <p>getColor.</p> * <p>
* getColor.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* @param color a {@link java.lang.String} object. * a {@link forge.CardList} object.
* @param color
* a {@link java.lang.String} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public static CardList getColor(CardList list, final String color) { public static CardList getColor(final CardList list, final String color) {
return list.filter(new CardListFilter() { return list.filter(new CardListFilter() {
public boolean addCard(Card c) { public boolean addCard(final Card c) {
return CardUtil.getColors(c).contains(color); return CardUtil.getColors(c).contains(color);
} }
}); });
}//getColor() } // getColor()
/** /**
* <p>getGoldCards.</p> * <p>
* getGoldCards.
* </p>
* *
* @param list a {@link forge.CardList} object. * @param list
* a {@link forge.CardList} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public static CardList getGoldCards(CardList list) { public static CardList getGoldCards(final CardList list) {
return list.filter(new CardListFilter() { return list.filter(new CardListFilter() {
public boolean addCard(Card c) { public boolean addCard(final Card c) {
return CardUtil.getColors(c).size() >= 2; return CardUtil.getColors(c).size() >= 2;
} }
}); });
} }
/** /**
* <p>sumAttack.</p> * <p>
* sumAttack.
* </p>
* *
* @param c a {@link forge.CardList} object. * @param c
* a {@link forge.CardList} object.
* @return a int. * @return a int.
*/ */
public static int sumAttack(CardList c) { public static int sumAttack(final CardList c) {
int attack = 0; int attack = 0;
for (int i = 0; i < c.size(); i++) { 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).hasSecondStrike()) {
if (c.get(i).isCreature() && (!c.get(i).hasFirstStrike() || (c.get(i).hasDoubleStrike() && c.get(i).hasFirstStrike()))) { if (c.get(i).isCreature()
&& (!c.get(i).hasFirstStrike() || (c.get(i).hasDoubleStrike() && c.get(i).hasFirstStrike())))
{
attack += c.get(i).getNetCombatDamage(); attack += c.get(i).getNetCombatDamage();
} }
} }
//System.out.println("Total attack: " +attack); // System.out.println("Total attack: " +attack);
return attack; return attack;
}//sumAttack() } // sumAttack()
/** /**
* <p>sumDefense.</p> * <p>
* sumDefense.
* </p>
* *
* @param c a {@link forge.CardList} object. * @param c
* a {@link forge.CardList} object.
* @return a int. * @return a int.
*/ */
public static int sumDefense(CardList c) { public static int sumDefense(final CardList c) {
int defense = 0; int defense = 0;
for (int i = 0; i < c.size(); i++) { 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).hasSecondStrike()) {
if (c.get(i).isCreature()) if (c.get(i).isCreature()) {
defense += c.get(i).getNetDefense(); defense += c.get(i).getNetDefense();
}
} }
//System.out.println("Total attack: " +attack); // System.out.println("Total attack: " +attack);
return defense; return defense;
}//sumAttack() } // sumAttack()
/** /**
* <p>sumFirstStrikeAttack.</p> * <p>
* sumFirstStrikeAttack.
* </p>
* *
* @param c a {@link forge.CardList} object. * @param c
* a {@link forge.CardList} object.
* @return a int. * @return a int.
*/ */
public static int sumFirstStrikeAttack(CardList c) { public static int sumFirstStrikeAttack(final CardList c) {
int attack = 0; int attack = 0;
for (int i = 0; i < c.size(); i++) { for (int i = 0; i < c.size(); i++) {
@@ -431,33 +516,47 @@ public class CardListUtil {
} }
Log.debug("Total First Strike attack: " + attack); Log.debug("Total First Strike attack: " + attack);
return attack; return attack;
}//sumFirstStrikeAttack() } // sumFirstStrikeAttack()
//Get the total converted mana cost of a card list // Get the total converted mana cost of a card list
/** /**
* <p>sumCMC.</p> * <p>
* sumCMC.
* </p>
* *
* @param c a {@link forge.CardList} object. * @param c
* a {@link forge.CardList} object.
* @return a int. * @return a int.
*/ */
public static int sumCMC(CardList c) { public static int sumCMC(final CardList c) {
int cmc = 0; int cmc = 0;
for (int i = 0; i < c.size(); i++) { for (int i = 0; i < c.size(); i++) {
cmc += CardUtil.getConvertedManaCost(c.get(i).getManaCost()); cmc += CardUtil.getConvertedManaCost(c.get(i).getManaCost());
} }
//System.out.println("Total CMC: " +cmc); // System.out.println("Total CMC: " +cmc);
return cmc; return cmc;
}//sumCMC } // sumCMC
public static CardList getRandomSubList(CardList c, int amount){ /**
if (c.size() < amount) *
* TODO Write javadoc for this method.
*
* @param c
* CardList
* @param amount
* int
* @return CardList
*/
public static CardList getRandomSubList(final CardList c, final int amount) {
if (c.size() < amount) {
return null; return null;
}
CardList subList = new CardList(); CardList subList = new CardList();
while(subList.size() < amount){ while (subList.size() < amount) {
c.shuffle(); c.shuffle();
subList.add(c.get(0)); subList.add(c.get(0));
c.remove(0); c.remove(0);

View File

@@ -27,7 +27,6 @@ import net.slightlymagic.braids.util.progress_monitor.StderrProgressMonitor;
import com.google.code.jyield.Generator; import com.google.code.jyield.Generator;
import com.google.code.jyield.YieldUtils; import com.google.code.jyield.YieldUtils;
import forge.card.CardColor;
import forge.card.CardRules; import forge.card.CardRules;
import forge.card.CardRulesReader; import forge.card.CardRulesReader;
import forge.card.trigger.TriggerHandler; import forge.card.trigger.TriggerHandler;
@@ -35,33 +34,57 @@ import forge.error.ErrorViewer;
import forge.properties.NewConstants; import forge.properties.NewConstants;
import forge.view.FView; import forge.view.FView;
/** /**
* <p>CardReader class.</p> * <p>
* CardReader class.
* </p>
* *
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
public class CardReader public class CardReader implements Runnable, NewConstants {
implements Runnable, // NOPMD by Braids on 8/18/11 10:55 PM // NOPMD by Braids on 8/18/11 10:55
NewConstants // PM
{ private static final String CARD_FILE_DOT_EXTENSION = ".txt"; // NOPMD by
private static final String CARD_FILE_DOT_EXTENSION = ".txt"; // NOPMD by Braids on 8/18/11 11:04 PM // Braids on
// 8/18/11
// 11:04 PM
/** Default charset when loading from files. */ /** Default charset when loading from files. */
public static final String DEFAULT_CHARSET_NAME = "US-ASCII"; // NOPMD by Braids on 8/18/11 10:54 PM public static final String DEFAULT_CHARSET_NAME = "US-ASCII"; // NOPMD by
// Braids on
// 8/18/11
// 10:54 PM
/** Regex that matches a single hyphen (-) or space. */ /** Regex that matches a single hyphen (-) or space. */
public static final Pattern HYPHEN_OR_SPACE = Pattern.compile("[ -]"); public static final Pattern HYPHEN_OR_SPACE = Pattern.compile("[ -]");
/** Regex for punctuation that we omit from card file names. */ /** Regex for punctuation that we omit from card file names. */
public static final Pattern PUNCTUATION_TO_ZAP = Pattern.compile("[,'\"]"); // NOPMD by Braids on 8/18/11 10:54 PM public static final Pattern PUNCTUATION_TO_ZAP = Pattern.compile("[,'\"]"); // NOPMD
// by
// Braids
// on
// 8/18/11
// 10:54
// PM
/** Regex that matches two or more underscores (_). */ /** Regex that matches two or more underscores (_). */
public static final Pattern MULTIPLE_UNDERSCORES = Pattern.compile("__+"); // NOPMD by Braids on 8/18/11 10:54 PM public static final Pattern MULTIPLE_UNDERSCORES = Pattern.compile("__+"); // NOPMD
// by
// Braids
// on
// 8/18/11
// 10:54
// PM
/** Special value for estimatedFilesRemaining. */ /** Special value for estimatedFilesRemaining. */
protected static final int UNKNOWN_NUMBER_OF_FILES_REMAINING = -1; // NOPMD by Braids on 8/18/11 10:54 PM protected static final int UNKNOWN_NUMBER_OF_FILES_REMAINING = -1; // NOPMD
// by
// Braids
// on
// 8/18/11
// 10:54
// PM
private transient Map<String, Card> mapToFill; private transient Map<String, Card> mapToFill;
private transient List<CardRules> listRulesToFill; private transient List<CardRules> listRulesToFill;
@@ -73,46 +96,71 @@ public class CardReader
private transient Enumeration<? extends ZipEntry> zipEnum; private transient Enumeration<? extends ZipEntry> zipEnum;
private transient long estimatedFilesRemaining = // NOPMD by Braids on 8/18/11 10:56 PM private transient long estimatedFilesRemaining = // NOPMD by Braids on
UNKNOWN_NUMBER_OF_FILES_REMAINING; // 8/18/11 10:56 PM
UNKNOWN_NUMBER_OF_FILES_REMAINING;
private transient Iterable<File> findNonDirsIterable; // NOPMD by Braids on 8/18/11 10:56 PM private transient Iterable<File> findNonDirsIterable; // NOPMD by Braids on
// 8/18/11 10:56 PM
/**
* Instantiates a new card reader.
public CardReader(final File theCardsFolder, final Map<String, Card> theMapToFill ) { *
* @param theCardsFolder
* the the cards folder
* @param theMapToFill
* the the map to fill
*/
public CardReader(final File theCardsFolder, final Map<String, Card> theMapToFill) {
this(theCardsFolder, theMapToFill, null, true); this(theCardsFolder, theMapToFill, null, true);
} }
/** /**
* This is a convenience for CardReader(cardsfolder, mapToFill, true); . * This is a convenience for CardReader(cardsfolder, mapToFill, true); .
* *
* @param theCardsFolder indicates location of the cardsFolder * @param theCardsFolder
* * indicates location of the cardsFolder
* @param theMapToFill maps card names to Card instances; this is where we * @param listRules2Fill
* place the cards once read * List<CardRules>
* @param theMapToFill
* maps card names to Card instances; this is where we place the
* cards once read
* *
*/ */
public CardReader(final File theCardsFolder, final Map<String, Card> theMapToFill, public CardReader(final File theCardsFolder, final Map<String, Card> theMapToFill,
final List<CardRules> listRules2Fill) { final List<CardRules> listRules2Fill)
{
this(theCardsFolder, theMapToFill, listRules2Fill, true); this(theCardsFolder, theMapToFill, listRules2Fill, true);
} }
/** /**
* <p>Constructor for CardReader.</p> * <p>
* Constructor for CardReader.
* </p>
* *
* @param theCardsFolder indicates location of the cardsFolder * @param theCardsFolder
* indicates location of the cardsFolder
* *
* @param theMapToFill maps card names to Card instances; this is where we * @param theMapToFill
* place the cards once read * maps card names to Card instances; this is where we place the
* * cards once read
* @param useZip if true, attempts to load cards from a zip file, if one exists. * @param listRules2Fill
* List<CardRules>
* @param useZip
* if true, attempts to load cards from a zip file, if one
* exists.
*/ */
public CardReader(final File theCardsFolder, final Map<String, Card> theMapToFill, public CardReader(final File theCardsFolder, final Map<String, Card> theMapToFill,
final List<CardRules> listRules2Fill, final boolean useZip) final List<CardRules> listRules2Fill, final boolean useZip)
{ {
if (theMapToFill == null) { if (theMapToFill == null) {
throw new NullPointerException("theMapToFill must not be null."); // NOPMD by Braids on 8/18/11 10:53 PM throw new NullPointerException("theMapToFill must not be null."); // NOPMD
// by
// Braids
// on
// 8/18/11
// 10:53
// PM
} }
this.mapToFill = theMapToFill; this.mapToFill = theMapToFill;
// These read data for lightweight classes. // These read data for lightweight classes.
@@ -122,18 +170,16 @@ public class CardReader
if (!theCardsFolder.exists()) { if (!theCardsFolder.exists()) {
throw new RuntimeException(// NOPMD by Braids on 8/18/11 10:53 PM throw new RuntimeException(// NOPMD by Braids on 8/18/11 10:53 PM
"CardReader : constructor error -- file not found -- filename is " "CardReader : constructor error -- file not found -- filename is "
+ theCardsFolder.getAbsolutePath()); + theCardsFolder.getAbsolutePath());
} }
if (!theCardsFolder.isDirectory()) { if (!theCardsFolder.isDirectory()) {
throw new RuntimeException(// NOPMD by Braids on 8/18/11 10:53 PM throw new RuntimeException(// NOPMD by Braids on 8/18/11 10:53 PM
"CardReader : constructor error -- not a directory -- " "CardReader : constructor error -- not a directory -- " + theCardsFolder.getAbsolutePath());
+ theCardsFolder.getAbsolutePath());
} }
this.cardsfolder = theCardsFolder; this.cardsfolder = theCardsFolder;
final File zipFile = new File(theCardsFolder, "cardsfolder.zip"); final File zipFile = new File(theCardsFolder, "cardsfolder.zip");
// Prepare resources to read cards lazily. // Prepare resources to read cards lazily.
@@ -141,12 +187,16 @@ public class CardReader
try { try {
this.zip = new ZipFile(zipFile); this.zip = new ZipFile(zipFile);
} catch (Exception exn) { } catch (Exception exn) {
System.err.println("Error reading zip file \"" // NOPMD by Braids on 8/18/11 10:53 PM System.err.println("Error reading zip file \"" // NOPMD by
+ zipFile.getAbsolutePath() + "\": " + exn + ". " // Braids on
// 8/18/11 10:53
// PM
+ zipFile.getAbsolutePath()
+ "\": "
+ exn
+ ". "
+ "Defaulting to txt files in \"" + "Defaulting to txt files in \""
+ theCardsFolder.getAbsolutePath() + theCardsFolder.getAbsolutePath() + "\".");
+ "\"."
);
} }
} }
@@ -158,22 +208,22 @@ public class CardReader
setEncoding(DEFAULT_CHARSET_NAME); setEncoding(DEFAULT_CHARSET_NAME);
} //CardReader() } // CardReader()
/** /**
* This finalizer helps assure there is no memory or thread leak with * This finalizer helps assure there is no memory or thread leak with
* findNonDirsIterable, which was created with YieldUtils.toIterable. * findNonDirsIterable, which was created with YieldUtils.toIterable.
* *
* @throws Throwable indirectly * @throws Throwable
* indirectly
*/ */
protected final void finalize() throws Throwable { protected final void finalize() throws Throwable {
try { try {
if (findNonDirsIterable != null) { if (findNonDirsIterable != null) {
for (@SuppressWarnings("unused") File ignored for (@SuppressWarnings("unused")
: findNonDirsIterable) // Do nothing; just exercising the Iterable.
File ignored : findNonDirsIterable)
{ {
// Do nothing; just exercising the Iterable.
} }
} }
} finally { } finally {
@@ -181,9 +231,8 @@ public class CardReader
} }
} }
/** /**
* Reads the rest of ALL the cards into memory. This is not lazy. * Reads the rest of ALL the cards into memory. This is not lazy.
*/ */
public final void run() { public final void run() {
loadCardsUntilYouFind(null); loadCardsUntilYouFind(null);
@@ -195,7 +244,8 @@ public class CardReader
* After that, we save our place in the list of cards (on disk) in case we * After that, we save our place in the list of cards (on disk) in case we
* need to load more. * need to load more.
* *
* @param cardName the name to find; if null, load all cards. * @param cardName
* the name to find; if null, load all cards.
* *
* @return the Card or null if it was not found. * @return the Card or null if it was not found.
*/ */
@@ -223,7 +273,7 @@ public class CardReader
findNonDirsIterable = YieldUtils.toIterable(findNonDirsGen); findNonDirsIterable = YieldUtils.toIterable(findNonDirsGen);
} }
if(monitor!=null) { if (monitor != null) {
monitor.setTotalUnitsThisPhase(estimatedFilesRemaining); monitor.setTotalUnitsThisPhase(estimatedFilesRemaining);
} }
@@ -237,10 +287,11 @@ public class CardReader
monitor.incrementUnitsCompletedThisPhase(1L); monitor.incrementUnitsCompletedThisPhase(1L);
if (cardName != null && cardName.equals(result.getName())) { if (cardName != null && cardName.equals(result.getName())) {
break; // no thread leak here if entire card DB is loaded, or if this object is finalized. break; // no thread leak here if entire card DB is loaded,
// or if this object is finalized.
} }
} //endfor } // endfor
} else { } else {
monitor.setTotalUnitsThisPhase(estimatedFilesRemaining); monitor.setTotalUnitsThisPhase(estimatedFilesRemaining);
@@ -263,17 +314,20 @@ public class CardReader
} }
} }
} //endif } // endif
return result; return result;
} //loadCardsUntilYouFind(String) } // loadCardsUntilYouFind(String)
/** /**
* <p>addTypes to an existing card.</p> * <p>
* addTypes to an existing card.
* </p>
* *
* @param card a {@link forge.Card} object. * @param card
* @param types a {@link java.lang.String} object. * a {@link forge.Card} object.
* @param types
* a {@link java.lang.String} object.
*/ */
public static void addTypes(final Card card, final String types) { public static void addTypes(final Card card, final String types) {
final StringTokenizer tok = new StringTokenizer(types); final StringTokenizer tok = new StringTokenizer(types);
@@ -283,13 +337,16 @@ public class CardReader
} }
/** /**
* <p>Reads a line from the given reader and handles exceptions.</p> * <p>
* Reads a line from the given reader and handles exceptions.
* </p>
* *
* @return a {@link java.lang.String} object. * @return a {@link java.lang.String} object.
* @param reader a {@link java.io.BufferedReader} object. * @param reader
* a {@link java.io.BufferedReader} object.
*/ */
public static String readLine(final BufferedReader reader) { public static String readLine(final BufferedReader reader) {
//makes the checked exception, into an unchecked runtime exception // makes the checked exception, into an unchecked runtime exception
try { try {
String line = reader.readLine(); String line = reader.readLine();
if (line != null) { if (line != null) {
@@ -298,14 +355,23 @@ public class CardReader
return line; return line;
} catch (Exception ex) { } catch (Exception ex) {
ErrorViewer.showError(ex); ErrorViewer.showError(ex);
throw new RuntimeException("CardReader : readLine(Card) error", ex); // NOPMD by Braids on 8/18/11 10:53 PM throw new RuntimeException("CardReader : readLine(Card) error", ex); // NOPMD
// by
// Braids
// on
// 8/18/11
// 10:53
// PM
} }
} //readLine(BufferedReader) } // readLine(BufferedReader)
/** /**
* <p>load a card.</p> * <p>
* load a card.
* </p>
* *
* @param inputStream the stream from which to load the card's information * @param inputStream
* the stream from which to load the card's information
* *
* @return the card loaded from the stream * @return the card loaded from the stream
*/ */
@@ -322,21 +388,22 @@ public class CardReader
String line = readLine(reader); String line = readLine(reader);
while (!"End".equals(line)) { while (!"End".equals(line)) {
rulesReader.parseLine(line); rulesReader.parseLine(line);
if(line.isEmpty()) { if (line.isEmpty()) {
//Ignore empty lines. // Ignore empty lines.
} else if (line.charAt(0) == '#') { // NOPMD by Braids on 8/18/11 10:59 PM } else if (line.charAt(0) == '#') { // NOPMD by Braids on
//no need to do anything, this indicates a comment line // 8/18/11 10:59 PM
// no need to do anything, this indicates a comment line
} else if (line.startsWith("Name:")) { } else if (line.startsWith("Name:")) {
final String value = line.substring(5); final String value = line.substring(5);
//System.out.println(s); // System.out.println(s);
if (mapToFill.containsKey(value)) { if (mapToFill.containsKey(value)) {
break; // this card has already been loaded. break; // this card has already been loaded.
} else { } else {
card.setName(value); card.setName(value);
} }
} else if (line.startsWith("ManaCost:")) { } else if (line.startsWith("ManaCost:")) {
final String value = line.substring(9); final String value = line.substring(9);
//System.out.println(s); // System.out.println(s);
if (!"no cost".equals(value)) { if (!"no cost".equals(value)) {
card.setManaCost(value); card.setManaCost(value);
} }
@@ -391,13 +458,14 @@ public class CardReader
card.addStaticAbilityString(value); card.addStaticAbilityString(value);
} else if (line.startsWith("SetInfo:")) { } else if (line.startsWith("SetInfo:")) {
final String value = line.substring("SetInfo:".length()); final String value = line.substring("SetInfo:".length());
card.addSet(new SetInfo(value)); // NOPMD by Braids on 8/18/11 11:08 PM card.addSet(new SetInfo(value)); // NOPMD by Braids on
// 8/18/11 11:08 PM
} else if (line.equals("ALTERNATE")) { } else if (line.equals("ALTERNATE")) {
card.addAlternateState(); card.addAlternateState();
card.changeState(); card.changeState();
} else if (line.startsWith("AlternateMode:")) { } else if (line.startsWith("AlternateMode:")) {
final String value = line.substring("AlternateMode:".length()); final String value = line.substring("AlternateMode:".length());
if(value.equalsIgnoreCase("Flip")) { if (value.equalsIgnoreCase("Flip")) {
card.setFlip(true); card.setFlip(true);
} else { } else {
card.setDoubleFaced(true); card.setDoubleFaced(true);
@@ -405,7 +473,7 @@ public class CardReader
} else if (line.startsWith("Colors:")) { } else if (line.startsWith("Colors:")) {
final String value = line.substring("Colors:".length()); final String value = line.substring("Colors:".length());
ArrayList<Card_Color> newCols = new ArrayList<Card_Color>(); ArrayList<Card_Color> newCols = new ArrayList<Card_Color>();
for(String col : value.split(",")) { for (String col : value.split(",")) {
Card_Color newCol = new Card_Color(card); Card_Color newCol = new Card_Color(card);
newCol.addToCardColor(col); newCol.addToCardColor(col);
newCols.add(newCol); newCols.add(newCol);
@@ -420,40 +488,44 @@ public class CardReader
} finally { } finally {
try { try {
reader.close(); reader.close();
} catch (IOException ignored) { // NOPMD by Braids on 8/18/11 11:08 PM } catch (IOException ignored) { // NOPMD by Braids on 8/18/11 11:08
// PM
} }
try { try {
inputStreamReader.close(); inputStreamReader.close();
} catch (IOException ignored) { // NOPMD by Braids on 8/18/11 11:08 PM } catch (IOException ignored) { // NOPMD by Braids on 8/18/11 11:08
// PM
} }
} }
if(card.isInAlternateState()) { if (card.isInAlternateState()) {
card.changeState(); card.changeState();
} }
CardRules[] crdRules = rulesReader.getCard(); CardRules[] crdRules = rulesReader.getCard();
listRulesToFill.add(crdRules[0]); listRulesToFill.add(crdRules[0]);
if(crdRules[1] != null) { listRulesToFill.add(crdRules[1]); } if (crdRules[1] != null) {
listRulesToFill.add(crdRules[1]);
}
mapToFill.put(card.getName(), card); mapToFill.put(card.getName(), card);
return card; return card;
} }
/** /**
* Set the character encoding to use when loading cards. * Set the character encoding to use when loading cards.
* *
* @param charsetName the name of the charset, for example, "UTF-8" * @param charsetName
* the name of the charset, for example, "UTF-8"
*/ */
public final void setEncoding(final String charsetName) { public final void setEncoding(final String charsetName) {
this.charset = Charset.forName(charsetName); this.charset = Charset.forName(charsetName);
} }
/** /**
* Load a card from a txt file. * Load a card from a txt file.
* *
* @param pathToTxtFile the full or relative path to the file to load * @param pathToTxtFile
* the full or relative path to the file to load
* *
* @return a new Card instance * @return a new Card instance
*/ */
@@ -465,12 +537,12 @@ public class CardReader
} catch (FileNotFoundException ex) { } catch (FileNotFoundException ex) {
ErrorViewer.showError(ex, "File \"%s\" exception", pathToTxtFile.getAbsolutePath()); ErrorViewer.showError(ex, "File \"%s\" exception", pathToTxtFile.getAbsolutePath());
throw new RuntimeException(// NOPMD by Braids on 8/18/11 10:53 PM throw new RuntimeException(// NOPMD by Braids on 8/18/11 10:53 PM
"CardReader : run error -- file exception -- filename is " "CardReader : run error -- file exception -- filename is " + pathToTxtFile.getPath(), ex);
+ pathToTxtFile.getPath(), ex);
} finally { } finally {
try { try {
fileInputStream.close(); fileInputStream.close();
} catch (IOException ignored) { // NOPMD by Braids on 8/18/11 11:08 PM } catch (IOException ignored) { // NOPMD by Braids on 8/18/11 11:08
// PM
} }
} }
} }
@@ -478,7 +550,8 @@ public class CardReader
/** /**
* Load a card from an entry in a zip file. * Load a card from an entry in a zip file.
* *
* @param entry to load from * @param entry
* to load from
* *
* @return a new Card instance * @return a new Card instance
*/ */
@@ -489,26 +562,28 @@ public class CardReader
return loadCard(zipInputStream); return loadCard(zipInputStream);
} catch (IOException exn) { } catch (IOException exn) {
throw new RuntimeException(exn); // NOPMD by Braids on 8/18/11 10:53 PM throw new RuntimeException(exn); // NOPMD by Braids on 8/18/11 10:53
// PM
} finally { } finally {
try { try {
if (zipInputStream != null) { if (zipInputStream != null) {
zipInputStream.close(); zipInputStream.close();
} }
} catch (IOException ignored) { // NOPMD by Braids on 8/18/11 11:08 PM } catch (IOException ignored) { // NOPMD by Braids on 8/18/11 11:08
// PM
} }
} }
} }
/** /**
* Attempt to guess what the path to a given card's txt file would be. * Attempt to guess what the path to a given card's txt file would be.
* *
* @param asciiCardName the card name in canonicalized ASCII form * @param asciiCardName
* the card name in canonicalized ASCII form
* *
* @return the likeliest path of the card's txt file, excluding * @return the likeliest path of the card's txt file, excluding cardsFolder
* cardsFolder but including the subdirectory of that and the ".txt" * but including the subdirectory of that and the ".txt" suffix. For
* suffix. For example, "e/elvish_warrior.txt" * example, "e/elvish_warrior.txt"
* *
* @see CardUtil#canonicalizeCardName * @see CardUtil#canonicalizeCardName
*/ */
@@ -520,7 +595,8 @@ public class CardReader
* commas and apostrophes are removed (I'm not sure if there are any * commas and apostrophes are removed (I'm not sure if there are any
* other punctuation used)." * other punctuation used)."
* *
* @see http://www.slightlymagic.net/forum/viewtopic.php?f=52&t=4887#p63189 * @see
* http://www.slightlymagic.net/forum/viewtopic.php?f=52&t=4887#p63189
*/ */
baseFileName = HYPHEN_OR_SPACE.matcher(baseFileName).replaceAll("_"); baseFileName = HYPHEN_OR_SPACE.matcher(baseFileName).replaceAll("_");
@@ -543,11 +619,15 @@ public class CardReader
/** /**
* Attempt to load a card by its canonical ASCII name. * Attempt to load a card by its canonical ASCII name.
* *
* @param canonicalASCIIName the canonical ASCII name of the card * @param canonicalASCIIName
* the canonical ASCII name of the card
* *
* @return a new Card instance having that name, or null if not found * @return a new Card instance having that name, or null if not found
*/ */
public final Card findCard(final String canonicalASCIIName) { // NOPMD by Braids on 8/18/11 11:08 PM public final Card findCard(final String canonicalASCIIName) { // NOPMD by
// Braids on
// 8/18/11
// 11:08 PM
UtilFunctions.checkNotNull("canonicalASCIIName", canonicalASCIIName); UtilFunctions.checkNotNull("canonicalASCIIName", canonicalASCIIName);
final String cardFilePath = toMostLikelyPath(canonicalASCIIName); final String cardFilePath = toMostLikelyPath(canonicalASCIIName);
@@ -567,7 +647,7 @@ public class CardReader
} }
if (result == null || !(result.getName().equals(canonicalASCIIName))) { if (result == null || !(result.getName().equals(canonicalASCIIName))) {
//System.err.println(":Could not find \"" + cardFilePath + "\"."); // System.err.println(":Could not find \"" + cardFilePath + "\".");
result = loadCardsUntilYouFind(canonicalASCIIName); result = loadCardsUntilYouFind(canonicalASCIIName);
} }

View File

@@ -1,12 +1,5 @@
package forge; package forge;
import forge.card.mana.ManaCost;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityList;
import forge.item.CardPrinted;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@@ -20,9 +13,18 @@ import net.slightlymagic.maxmtg.Predicate;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import forge.card.mana.ManaCost;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityList;
import forge.item.CardPrinted;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
// TODO: Auto-generated Javadoc
/** /**
* <p>CardUtil class.</p> * <p>
* CardUtil class.
* </p>
* *
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
@@ -31,7 +33,6 @@ public final class CardUtil {
/** Constant <code>RANDOM</code>. */ /** Constant <code>RANDOM</code>. */
public static final Random RANDOM = MyRandom.random; public static final Random RANDOM = MyRandom.random;
/** /**
* Do not instantiate. * Do not instantiate.
*/ */
@@ -40,24 +41,29 @@ public final class CardUtil {
} }
/** /**
* <p>getRandomIndex.</p> * <p>
* getRandomIndex.
* </p>
* *
* @param o an array of {@link java.lang.Object} objects. * @param o
* an array of {@link java.lang.Object} objects.
* @return a int. * @return a int.
*/ */
public static int getRandomIndex(final Object[] o) { public static int getRandomIndex(final Object[] o) {
if (o == null || o.length == 0) { if (o == null || o.length == 0) {
throw new RuntimeException( throw new RuntimeException("CardUtil : getRandomIndex() argument is null or length is 0");
"CardUtil : getRandomIndex() argument is null or length is 0");
} }
return RANDOM.nextInt(o.length); return RANDOM.nextInt(o.length);
} }
/** /**
* <p>getRandom.</p> * <p>
* getRandom.
* </p>
* *
* @param o an array of {@link forge.Card} objects. * @param o
* an array of {@link forge.Card} objects.
* @return a {@link forge.Card} object. * @return a {@link forge.Card} object.
*/ */
public static Card getRandom(final Card[] o) { public static Card getRandom(final Card[] o) {
@@ -65,36 +71,44 @@ public final class CardUtil {
} }
/** /**
* <p>getRandomIndex.</p> * <p>
* getRandomIndex.
* </p>
* *
* @param list a {@link forge.card.spellability.SpellAbilityList} object. * @param list
* a {@link forge.card.spellability.SpellAbilityList} object.
* @return a int. * @return a int.
*/ */
public static int getRandomIndex(final SpellAbilityList list) { public static int getRandomIndex(final SpellAbilityList list) {
if (list == null || list.size() == 0) { if (list == null || list.size() == 0) {
throw new RuntimeException( throw new RuntimeException("CardUtil : getRandomIndex(SpellAbilityList) argument is null or length is 0");
"CardUtil : getRandomIndex(SpellAbilityList) argument is null or length is 0");
} }
return RANDOM.nextInt(list.size()); return RANDOM.nextInt(list.size());
} }
/** /**
* <p>getRandomIndex.</p> * <p>
* getRandomIndex.
* </p>
* *
* @param c a {@link forge.CardList} object. * @param c
* a {@link forge.CardList} object.
* @return a int. * @return a int.
*/ */
public static int getRandomIndex(final CardList c) { public static int getRandomIndex(final CardList c) {
return RANDOM.nextInt(c.size()); return RANDOM.nextInt(c.size());
} }
//returns Card Name (unique number) attack/defense // returns Card Name (unique number) attack/defense
//example: Big Elf (12) 2/3 // example: Big Elf (12) 2/3
/** /**
* <p>toText.</p> * <p>
* toText.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
* @return a {@link java.lang.String} object. * @return a {@link java.lang.String} object.
*/ */
public static String toText(final Card c) { public static String toText(final Card c) {
@@ -102,9 +116,12 @@ public final class CardUtil {
} }
/** /**
* <p>toCard.</p> * <p>
* toCard.
* </p>
* *
* @param col a {@link java.util.Collection} object. * @param col
* a {@link java.util.Collection} object.
* @return an array of {@link forge.Card} objects. * @return an array of {@link forge.Card} objects.
*/ */
public static Card[] toCard(final Collection<Card> col) { public static Card[] toCard(final Collection<Card> col) {
@@ -116,8 +133,8 @@ public final class CardUtil {
if (swap instanceof Card) { if (swap instanceof Card) {
c[i] = (Card) o[i]; c[i] = (Card) o[i];
} else { } else {
throw new RuntimeException("CardUtil : toCard() invalid class, should be Card - " throw new RuntimeException("CardUtil : toCard() invalid class, should be Card - " + o[i].getClass()
+ o[i].getClass() + " - toString() - " + o[i].toString()); + " - toString() - " + o[i].toString());
} }
} }
@@ -125,9 +142,12 @@ public final class CardUtil {
} }
/** /**
* <p>toCard.</p> * <p>
* toCard.
* </p>
* *
* @param list a {@link java.util.ArrayList} object. * @param list
* a {@link java.util.ArrayList} object.
* @return an array of {@link forge.Card} objects. * @return an array of {@link forge.Card} objects.
*/ */
public static Card[] toCard(final ArrayList<Card> list) { public static Card[] toCard(final ArrayList<Card> list) {
@@ -137,9 +157,12 @@ public final class CardUtil {
} }
/** /**
* <p>toList.</p> * <p>
* toList.
* </p>
* *
* @param c an array of {@link forge.Card} objects. * @param c
* an array of {@link forge.Card} objects.
* @return a {@link java.util.ArrayList} object. * @return a {@link java.util.ArrayList} object.
*/ */
public static ArrayList<Card> toList(final Card[] c) { public static ArrayList<Card> toList(final Card[] c) {
@@ -150,11 +173,14 @@ public final class CardUtil {
return a; return a;
} }
//returns "G", longColor is Constant.Color.Green and the like // returns "G", longColor is Constant.Color.Green and the like
/** /**
* <p>getShortColor.</p> * <p>
* getShortColor.
* </p>
* *
* @param longColor a {@link java.lang.String} object. * @param longColor
* a {@link java.lang.String} object.
* @return a {@link java.lang.String} object. * @return a {@link java.lang.String} object.
*/ */
public static String getShortColor(final String longColor) { public static String getShortColor(final String longColor) {
@@ -174,10 +200,14 @@ public final class CardUtil {
} }
/** /**
* <p>isColor.</p> * <p>
* isColor.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* @param col a {@link java.lang.String} object. * a {@link forge.Card} object.
* @param col
* a {@link java.lang.String} object.
* @return a boolean. * @return a boolean.
*/ */
public static boolean isColor(final Card c, final String col) { public static boolean isColor(final Card c, final String col) {
@@ -186,9 +216,12 @@ public final class CardUtil {
} }
/** /**
* <p>getColors.</p> * <p>
* getColors.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
* @return a {@link java.util.ArrayList} object. * @return a {@link java.util.ArrayList} object.
*/ */
public static ArrayList<String> getColors(final Card c) { public static ArrayList<String> getColors(final Card c) {
@@ -196,9 +229,12 @@ public final class CardUtil {
} }
/** /**
* <p>getOnlyColors.</p> * <p>
* getOnlyColors.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
* @return a {@link java.util.ArrayList} object. * @return a {@link java.util.ArrayList} object.
*/ */
public static ArrayList<String> getOnlyColors(final Card c) { public static ArrayList<String> getOnlyColors(final Card c) {
@@ -240,12 +276,15 @@ public final class CardUtil {
return new ArrayList<String>(colors); return new ArrayList<String>(colors);
} }
/** /**
* <p>hasCardName.</p> * <p>
* hasCardName.
* </p>
* *
* @param cardName a {@link java.lang.String} object. * @param cardName
* @param list a {@link java.util.ArrayList} object. * a {@link java.lang.String} object.
* @param list
* a {@link java.util.ArrayList} object.
* @return a boolean. * @return a boolean.
*/ */
public static boolean hasCardName(final String cardName, final ArrayList<Card> list) { public static boolean hasCardName(final String cardName, final ArrayList<Card> list) {
@@ -260,13 +299,16 @@ public final class CardUtil {
} }
} }
return b; return b;
} //hasCardName() } // hasCardName()
//probably should put this somewhere else, but not sure where // probably should put this somewhere else, but not sure where
/** /**
* <p>getConvertedManaCost.</p> * <p>
* getConvertedManaCost.
* </p>
* *
* @param sa a {@link forge.card.spellability.SpellAbility} object. * @param sa
* a {@link forge.card.spellability.SpellAbility} object.
* @return a int. * @return a int.
*/ */
public static int getConvertedManaCost(final SpellAbility sa) { public static int getConvertedManaCost(final SpellAbility sa) {
@@ -274,9 +316,12 @@ public final class CardUtil {
} }
/** /**
* <p>getConvertedManaCost.</p> * <p>
* getConvertedManaCost.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
* @return a int. * @return a int.
*/ */
public static int getConvertedManaCost(final Card c) { public static int getConvertedManaCost(final Card c) {
@@ -287,9 +332,12 @@ public final class CardUtil {
} }
/** /**
* <p>getConvertedManaCost.</p> * <p>
* getConvertedManaCost.
* </p>
* *
* @param manaCost a {@link java.lang.String} object. * @param manaCost
* a {@link java.lang.String} object.
* @return a int. * @return a int.
*/ */
public static int getConvertedManaCost(final String manaCost) { public static int getConvertedManaCost(final String manaCost) {
@@ -302,10 +350,14 @@ public final class CardUtil {
} }
/** /**
* <p>addManaCosts.</p> * <p>
* addManaCosts.
* </p>
* *
* @param mc1 a {@link java.lang.String} object. * @param mc1
* @param mc2 a {@link java.lang.String} object. * a {@link java.lang.String} object.
* @param mc2
* a {@link java.lang.String} object.
* @return a {@link java.lang.String} object. * @return a {@link java.lang.String} object.
*/ */
public static String addManaCosts(final String mc1, final String mc2) { public static String addManaCosts(final String mc1, final String mc2) {
@@ -336,15 +388,19 @@ public final class CardUtil {
tMC = tCL.toString() + " " + cc1 + " " + cc2; tMC = tCL.toString() + " " + cc1 + " " + cc2;
//System.out.println("TMC:" + tMC); // System.out.println("TMC:" + tMC);
return tMC.trim(); return tMC.trim();
} }
/** /**
* <p>getRelative.</p> * <p>
* getRelative.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* @param relation a {@link java.lang.String} object. * a {@link forge.Card} object.
* @param relation
* a {@link java.lang.String} object.
* @return a {@link forge.Card} object. * @return a {@link forge.Card} object.
*/ */
public static Card getRelative(final Card c, final String relation) { public static Card getRelative(final Card c, final String relation) {
@@ -354,17 +410,20 @@ public final class CardUtil {
return c.getEnchantingCard(); return c.getEnchantingCard();
} else if (relation.startsWith("equipped ")) { } else if (relation.startsWith("equipped ")) {
return c.getEquipping().get(0); return c.getEquipping().get(0);
//else if(relation.startsWith("target ")) return c.getTargetCard(); // else if(relation.startsWith("target ")) return c.getTargetCard();
} else { } else {
throw new IllegalArgumentException("Error at CardUtil.getRelative: " + relation throw new IllegalArgumentException(
+ "is not a valid relation"); "Error at CardUtil.getRelative: " + relation + "is not a valid relation");
} }
} }
/** /**
* <p>isACardType.</p> * <p>
* isACardType.
* </p>
* *
* @param cardType a {@link java.lang.String} object. * @param cardType
* a {@link java.lang.String} object.
* @return a boolean. * @return a boolean.
*/ */
public static boolean isACardType(final String cardType) { public static boolean isACardType(final String cardType) {
@@ -372,17 +431,19 @@ public final class CardUtil {
} }
/** /**
* <p>getAllCardTypes.</p> * <p>
* getAllCardTypes.
* </p>
* *
* @return a {@link java.util.ArrayList} object. * @return a {@link java.util.ArrayList} object.
*/ */
public static ArrayList<String> getAllCardTypes() { public static ArrayList<String> getAllCardTypes() {
ArrayList<String> types = new ArrayList<String>(); ArrayList<String> types = new ArrayList<String>();
//types.addAll(getCardTypes()); // types.addAll(getCardTypes());
types.addAll(Constant.CardTypes.cardTypes[0].list); types.addAll(Constant.CardTypes.cardTypes[0].list);
//not currently used by Forge // not currently used by Forge
types.add("Plane"); types.add("Plane");
types.add("Scheme"); types.add("Scheme");
types.add("Vanguard"); types.add("Vanguard");
@@ -391,21 +452,23 @@ public final class CardUtil {
} }
/** /**
* <p>getCardTypes.</p> * <p>
* getCardTypes.
* </p>
* *
* @return a {@link java.util.ArrayList} object. * @return a {@link java.util.ArrayList} object.
*/ */
public static ArrayList<String> getCardTypes() { public static ArrayList<String> getCardTypes() {
ArrayList<String> types = new ArrayList<String>(); ArrayList<String> types = new ArrayList<String>();
// types.add("Artifact"); // types.add("Artifact");
// types.add("Creature"); // types.add("Creature");
// types.add("Enchantment"); // types.add("Enchantment");
// types.add("Instant"); // types.add("Instant");
// types.add("Land"); // types.add("Land");
// types.add("Planeswalker"); // types.add("Planeswalker");
// types.add("Sorcery"); // types.add("Sorcery");
// types.add("Tribal"); // types.add("Tribal");
types.addAll(Constant.CardTypes.cardTypes[0].list); types.addAll(Constant.CardTypes.cardTypes[0].list);
@@ -413,7 +476,9 @@ public final class CardUtil {
} }
/** /**
* <p>getBasicTypes.</p> * <p>
* getBasicTypes.
* </p>
* *
* @return a {@link java.util.ArrayList} object. * @return a {@link java.util.ArrayList} object.
* @since 1.1.3 * @since 1.1.3
@@ -426,6 +491,11 @@ public final class CardUtil {
return types; return types;
} }
/**
* Gets the land types.
*
* @return the land types
*/
public static ArrayList<String> getLandTypes() { public static ArrayList<String> getLandTypes() {
ArrayList<String> types = new ArrayList<String>(); ArrayList<String> types = new ArrayList<String>();
@@ -436,7 +506,9 @@ public final class CardUtil {
} }
/** /**
* <p>getCreatureTypes.</p> * <p>
* getCreatureTypes.
* </p>
* *
* @return a {@link java.util.ArrayList} object. * @return a {@link java.util.ArrayList} object.
* @since 1.1.6 * @since 1.1.6
@@ -450,9 +522,12 @@ public final class CardUtil {
} }
/** /**
* <p>isASuperType.</p> * <p>
* isASuperType.
* </p>
* *
* @param cardType a {@link java.lang.String} object. * @param cardType
* a {@link java.lang.String} object.
* @return a boolean. * @return a boolean.
*/ */
@@ -461,9 +536,12 @@ public final class CardUtil {
} }
/** /**
* <p>isASubType.</p> * <p>
* isASubType.
* </p>
* *
* @param cardType a {@link java.lang.String} object. * @param cardType
* a {@link java.lang.String} object.
* @return a boolean. * @return a boolean.
*/ */
public static boolean isASubType(final String cardType) { public static boolean isASubType(final String cardType) {
@@ -471,9 +549,12 @@ public final class CardUtil {
} }
/** /**
* <p>isACreatureType.</p> * <p>
* isACreatureType.
* </p>
* *
* @param cardType a {@link java.lang.String} object. * @param cardType
* a {@link java.lang.String} object.
* @return a boolean. * @return a boolean.
*/ */
public static boolean isACreatureType(final String cardType) { public static boolean isACreatureType(final String cardType) {
@@ -481,34 +562,50 @@ public final class CardUtil {
} }
/** /**
* <p>isALandType.</p> * <p>
* isALandType.
* </p>
* *
* @param cardType a {@link java.lang.String} object. * @param cardType
* a {@link java.lang.String} object.
* @return a boolean. * @return a boolean.
*/ */
public static boolean isALandType(final String cardType) { public static boolean isALandType(final String cardType) {
return (Constant.CardTypes.landTypes[0].list.contains(cardType)); return (Constant.CardTypes.landTypes[0].list.contains(cardType));
} }
/**
* Checks if is a planeswalker type.
*
* @param cardType the card type
* @return true, if is a planeswalker type
*/
public static boolean isAPlaneswalkerType(final String cardType) { public static boolean isAPlaneswalkerType(final String cardType) {
return (Constant.CardTypes.walkerTypes[0].list.contains(cardType)); return (Constant.CardTypes.walkerTypes[0].list.contains(cardType));
} }
/** /**
* <p>isABasicLandType.</p> * <p>
* isABasicLandType.
* </p>
* *
* @param cardType a {@link java.lang.String} object. * @param cardType
* a {@link java.lang.String} object.
* @return a boolean. * @return a boolean.
*/ */
public static boolean isABasicLandType(final String cardType) { public static boolean isABasicLandType(final String cardType) {
return (Constant.CardTypes.basicTypes[0].list.contains(cardType)); return (Constant.CardTypes.basicTypes[0].list.contains(cardType));
} }
//this function checks, if duplicates of a keyword are not necessary (like flying, trample, etc.) // this function checks, if duplicates of a keyword are not necessary (like
// flying, trample, etc.)
/** /**
* <p>isNonStackingKeyword.</p> * <p>
* isNonStackingKeyword.
* </p>
* *
* @param keyword a {@link java.lang.String} object. * @param keyword
* a {@link java.lang.String} object.
* @return a boolean. * @return a boolean.
*/ */
public static boolean isNonStackingKeyword(final String keyword) { public static boolean isNonStackingKeyword(final String keyword) {
@@ -516,27 +613,40 @@ public final class CardUtil {
} }
/** /**
* <p>isStackingKeyword.</p> * <p>
* isStackingKeyword.
* </p>
* *
* @param keyword a {@link java.lang.String} object. * @param keyword
* a {@link java.lang.String} object.
* @return a boolean. * @return a boolean.
*/ */
public static boolean isStackingKeyword(final String keyword) { public static boolean isStackingKeyword(final String keyword) {
return !isNonStackingKeyword(keyword); return !isNonStackingKeyword(keyword);
} }
/**
public static String buildIdealFilename(final String cardName, final int artIndex, final int artIndexMax) * Builds the ideal filename.
{ *
String nn = artIndexMax > 1 ? Integer.toString(artIndex+1) : ""; * @param cardName the card name
* @param artIndex the art index
* @param artIndexMax the art index max
* @return the string
*/
public static String buildIdealFilename(final String cardName, final int artIndex, final int artIndexMax) {
String nn = artIndexMax > 1 ? Integer.toString(artIndex + 1) : "";
String mwsCardName = GuiDisplayUtil.cleanStringMWS(cardName); String mwsCardName = GuiDisplayUtil.cleanStringMWS(cardName);
//3 letter set code with MWS filename format // 3 letter set code with MWS filename format
return String.format("%s%s.full.jpg", mwsCardName, nn); return String.format("%s%s.full.jpg", mwsCardName, nn);
} }
/** /**
* <p>buildFilename.</p> * <p>
* buildFilename.
* </p>
* *
* @param card a {@link forge.Card} object. * @param card
* a {@link forge.Card} object.
* @return a {@link java.lang.String} object. * @return a {@link java.lang.String} object.
*/ */
public static String buildFilename(final Card card) { public static String buildFilename(final Card card) {
@@ -544,7 +654,10 @@ public final class CardUtil {
final String set = card.getCurSetCode(); final String set = card.getCurSetCode();
Predicate<SetInfo> findSetInfo = new Predicate<SetInfo>() { Predicate<SetInfo> findSetInfo = new Predicate<SetInfo>() {
@Override public boolean isTrue(final SetInfo subject) { return subject.Code.equals(set); } @Override
public boolean isTrue(final SetInfo subject) {
return subject.Code.equals(set);
}
}; };
SetInfo neededSet = findSetInfo.first(card.getSets()); SetInfo neededSet = findSetInfo.first(card.getSets());
int cntPictures = neededSet == null ? 1 : neededSet.PicCount; int cntPictures = neededSet == null ? 1 : neededSet.PicCount;
@@ -553,57 +666,73 @@ public final class CardUtil {
/** /**
* buildFilename for lightweight card. Searches for a matching file on disk, * buildFilename for lightweight card. Searches for a matching file on disk,
*
* @param card the card
* @return the string
*/ */
public static String buildFilename(final CardPrinted card) { public static String buildFilename(final CardPrinted card) {
int maxIndex = card.getCard().getSetInfo(card.getSet()).getCopiesCount(); int maxIndex = card.getCard().getSetInfo(card.getSet()).getCopiesCount();
return buildFilename(card.getName(), card.getSet(), card.getArtIndex(), maxIndex, false); return buildFilename(card.getName(), card.getSet(), card.getArtIndex(), maxIndex, false);
} }
private static String buildFilename(final String cardName, final String setName, private static String buildFilename(final String cardName, final String setName, final int artIndex,
final int artIndex, final int artIndexMax, final boolean isToken) final int artIndexMax, final boolean isToken)
{ {
File path = ForgeProps.getFile(isToken ? NewConstants.IMAGE_TOKEN : NewConstants.IMAGE_BASE); File path = ForgeProps.getFile(isToken ? NewConstants.IMAGE_TOKEN : NewConstants.IMAGE_BASE);
String nn = artIndexMax > 1 ? Integer.toString(artIndex+1) : ""; String nn = artIndexMax > 1 ? Integer.toString(artIndex + 1) : "";
String cleanCardName = GuiDisplayUtil.cleanString(cardName); String cleanCardName = GuiDisplayUtil.cleanString(cardName);
File f = null; File f = null;
if (StringUtils.isNotBlank(setName)) { if (StringUtils.isNotBlank(setName)) {
String mwsCardName = GuiDisplayUtil.cleanStringMWS(cardName); String mwsCardName = GuiDisplayUtil.cleanStringMWS(cardName);
//First, try 3 letter set code with MWS filename format // First, try 3 letter set code with MWS filename format
String mwsSet3 = String.format("%s/%s%s.full", setName, mwsCardName, nn); String mwsSet3 = String.format("%s/%s%s.full", setName, mwsCardName, nn);
f = new File(path, mwsSet3 + ".jpg"); f = new File(path, mwsSet3 + ".jpg");
if (f.exists()) { return mwsSet3; } if (f.exists()) {
return mwsSet3;
}
//Second, try 2 letter set code with MWS filename format // Second, try 2 letter set code with MWS filename format
String mwsSet2 = String.format("%s/%s%s.full", SetUtils.getCode2ByCode(setName), mwsCardName, nn); String mwsSet2 = String.format("%s/%s%s.full", SetUtils.getCode2ByCode(setName), mwsCardName, nn);
f = new File(path, mwsSet2 + ".jpg"); f = new File(path, mwsSet2 + ".jpg");
if (f.exists()) { return mwsSet2; } if (f.exists()) {
return mwsSet2;
}
//Third, try 3 letter set code with Forge filename format // Third, try 3 letter set code with Forge filename format
String forgeSet3 = String.format("%s/%s%s", setName, cleanCardName, nn); String forgeSet3 = String.format("%s/%s%s", setName, cleanCardName, nn);
f = new File(path, forgeSet3 + ".jpg"); f = new File(path, forgeSet3 + ".jpg");
if (f.exists()) { return forgeSet3; } if (f.exists()) {
return forgeSet3;
}
} }
//Last, give up with set images, go with the old picture type // Last, give up with set images, go with the old picture type
String forgePlain = String.format("%s%s", cleanCardName, nn); String forgePlain = String.format("%s%s", cleanCardName, nn);
f = new File(path, forgePlain + ".jpg"); f = new File(path, forgePlain + ".jpg");
if (f.exists()) { return forgePlain; } if (f.exists()) {
return forgePlain;
}
// give up with art index // give up with art index
f = new File(path, cleanCardName + ".jpg"); f = new File(path, cleanCardName + ".jpg");
if (f.exists()) { return cleanCardName; } if (f.exists()) {
return cleanCardName;
}
//if still no file, download if option enabled? // if still no file, download if option enabled?
return "none"; return "none";
} }
/** /**
* <p>getWeightedManaCost.</p> * <p>
* getWeightedManaCost.
* </p>
* *
* @param manaCost a {@link java.lang.String} object. * @param manaCost
* a {@link java.lang.String} object.
* @return a double. * @return a double.
*/ */
public static double getWeightedManaCost(final String manaCost) { public static double getWeightedManaCost(final String manaCost) {
@@ -616,9 +745,12 @@ public final class CardUtil {
} }
/** /**
* <p>getShortColorsString.</p> * <p>
* getShortColorsString.
* </p>
* *
* @param colors a {@link java.util.ArrayList} object. * @param colors
* a {@link java.util.ArrayList} object.
* @return a {@link java.lang.String} object. * @return a {@link java.lang.String} object.
*/ */
public static String getShortColorsString(final ArrayList<String> colors) { public static String getShortColorsString(final ArrayList<String> colors) {
@@ -644,13 +776,14 @@ public final class CardUtil {
/** /**
* Compute the canonicalized ASCII form of a card name. * Compute the canonicalized ASCII form of a card name.
* *
* @param cardName the name to transform (but not side effect) * @param cardName
* the name to transform (but not side effect)
* *
* @return the name in ASCII characters * @return the name in ASCII characters
*/ */
public static String canonicalizeCardName(final String cardName) { public static String canonicalizeCardName(final String cardName) {
String result = cardName; String result = cardName;
result = result.replace("\u00ae", "(R)"); // Ultimate Nightmare ... result = result.replace("\u00ae", "(R)"); // Ultimate Nightmare ...
result = result.replace("\u00c6", "AE"); result = result.replace("\u00c6", "AE");
result = result.replace("\u00e0", "a"); result = result.replace("\u00e0", "a");
result = result.replace("\u00e1", "a"); result = result.replace("\u00e1", "a");
@@ -666,7 +799,7 @@ public final class CardUtil {
result = result.replace("\u2015", "-"); result = result.replace("\u2015", "-");
result = result.replace("\u2018", "'"); result = result.replace("\u2018", "'");
result = result.replace("\u2019", "'"); result = result.replace("\u2019", "'");
result = result.replace("\u221e", "Infinity"); // Mox Lo... result = result.replace("\u221e", "Infinity"); // Mox Lo...
return result; return result;
} }
@@ -674,19 +807,24 @@ public final class CardUtil {
/** /**
* getThisTurnEntered. * getThisTurnEntered.
* *
* @param to zone going to * @param to
* @param from zone coming from * zone going to
* @param valid a isValid expression * @param from
* @param src a Card object * zone coming from
* @param valid
* a isValid expression
* @param src
* a Card object
* @return a CardList that matches the given criteria * @return a CardList that matches the given criteria
*/ */
public static CardList getThisTurnEntered(final Constant.Zone to, final Constant.Zone from, final String valid, final Card src) { public static CardList getThisTurnEntered(final Constant.Zone to, final Constant.Zone from, final String valid,
final Card src)
{
CardList res = new CardList(); CardList res = new CardList();
if (to != Constant.Zone.Stack) { if (to != Constant.Zone.Stack) {
res.addAll(((DefaultPlayerZone) AllZone.getComputerPlayer().getZone(to)).getCardsAddedThisTurn(from)); res.addAll(((DefaultPlayerZone) AllZone.getComputerPlayer().getZone(to)).getCardsAddedThisTurn(from));
res.addAll(((DefaultPlayerZone) AllZone.getHumanPlayer().getZone(to)).getCardsAddedThisTurn(from)); res.addAll(((DefaultPlayerZone) AllZone.getHumanPlayer().getZone(to)).getCardsAddedThisTurn(from));
} } else {
else {
res.addAll(((DefaultPlayerZone) AllZone.getStackZone()).getCardsAddedThisTurn(from)); res.addAll(((DefaultPlayerZone) AllZone.getStackZone()).getCardsAddedThisTurn(from));
} }
@@ -698,8 +836,10 @@ public final class CardUtil {
/** /**
* getThisTurnCast. * getThisTurnCast.
* *
* @param valid a String object * @param valid
* @param src a Card object * a String object
* @param src
* a Card object
* @return a CardList that matches the given criteria * @return a CardList that matches the given criteria
*/ */
public static CardList getThisTurnCast(final String valid, final Card src) { public static CardList getThisTurnCast(final String valid, final Card src) {
@@ -715,8 +855,10 @@ public final class CardUtil {
/** /**
* getLastTurnCast. * getLastTurnCast.
* *
* @param valid a String object * @param valid
* @param src a Card object * a String object
* @param src
* a Card object
* @return a CardList that matches the given criteria * @return a CardList that matches the given criteria
*/ */
public static CardList getLastTurnCast(final String valid, final Card src) { public static CardList getLastTurnCast(final String valid, final Card src) {
@@ -731,7 +873,9 @@ public final class CardUtil {
/** /**
* getLKICopy. * getLKICopy.
* @param c a Card. *
* @param c
* a Card.
* @return a copy of C with LastKnownInfo stuff retained. * @return a copy of C with LastKnownInfo stuff retained.
*/ */
public static Card getLKICopy(final Card c) { public static Card getLKICopy(final Card c) {
@@ -746,25 +890,31 @@ public final class CardUtil {
res.setNewPT(c.getNewPT()); res.setNewPT(c.getNewPT());
res.setReceivedDamageFromThisTurn(c.getReceivedDamageFromThisTurn()); res.setReceivedDamageFromThisTurn(c.getReceivedDamageFromThisTurn());
res.setHaunting(c.getHaunting()); res.setHaunting(c.getHaunting());
for(Card haunter : c.getHauntedBy()) { for (Card haunter : c.getHauntedBy()) {
res.addHauntedBy(haunter); res.addHauntedBy(haunter);
} }
return res; return res;
} }
/**
* Gets the radiance.
*
* @param source the source
* @param origin the origin
* @param valid the valid
* @return the radiance
*/
public static CardList getRadiance(final Card source, final Card origin, final String[] valid) { public static CardList getRadiance(final Card source, final Card origin, final String[] valid) {
CardList res = new CardList(); CardList res = new CardList();
for(Card_Color col : origin.getColor()) { for (Card_Color col : origin.getColor()) {
for(String strCol : col.toStringArray()) for (String strCol : col.toStringArray()) {
{ if (strCol.equalsIgnoreCase("Colorless")) {
if(strCol.equalsIgnoreCase("Colorless")) {
continue; continue;
} }
for(Card c : AllZoneUtil.getColorInPlay(strCol)) for (Card c : AllZoneUtil.getColorInPlay(strCol)) {
{ if (!res.contains(c) && c.isValid(valid, source.getController(), source) && !c.equals(origin)) {
if(!res.contains(c) && c.isValid(valid, source.getController(), source) && !c.equals(origin)) {
res.add(c); res.add(c);
} }
} }
@@ -774,4 +924,4 @@ public final class CardUtil {
return res; return res;
} }
} //end class CardUtil } // end class CardUtil

View File

@@ -1,37 +1,52 @@
package forge; package forge;
import forge.card.mana.ManaCost;
import java.util.EnumSet; import java.util.EnumSet;
import forge.card.mana.ManaCost;
// TODO Auto-generated Javadoc
/** /**
* <p>Color class.</p> * <p>
* Color class.
* </p>
* *
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
public enum Color { public enum Color {
/** The Colorless. */
Colorless(0), Colorless(0),
/** The White. */
White(1), White(1),
/** The Green. */
Green(2), Green(2),
/** The Red. */
Red(4), Red(4),
/** The Black. */
Black(8), Black(8),
/** The Blue. */
Blue(16); Blue(16);
@SuppressWarnings("unused") @SuppressWarnings("unused")
private int flag = 0; private int flag = 0;
/** /**
* <p>Constructor for Color.</p> * <p>
* Constructor for Color.
* </p>
* *
* @param c a int. * @param c
* a int.
*/ */
Color(final int c) { Color(final int c) {
flag = c; flag = c;
} }
/** /**
* <p>Colorless.</p> * <p>
* Colorless.
* </p>
* *
* @return a {@link java.util.EnumSet} object. * @return a {@link java.util.EnumSet} object.
*/ */
@@ -41,9 +56,12 @@ public enum Color {
} }
/** /**
* <p>ConvertStringsToColor.</p> * <p>
* ConvertStringsToColor.
* </p>
* *
* @param s an array of {@link java.lang.String} objects. * @param s
* an array of {@link java.lang.String} objects.
* @return a {@link java.util.EnumSet} object. * @return a {@link java.util.EnumSet} object.
*/ */
public static EnumSet<Color> ConvertStringsToColor(String[] s) { public static EnumSet<Color> ConvertStringsToColor(String[] s) {
@@ -61,33 +79,39 @@ public enum Color {
} }
/** /**
* <p>ConvertFromString.</p> * <p>
* ConvertFromString.
* </p>
* *
* @param s a {@link java.lang.String} object. * @param s
* a {@link java.lang.String} object.
* @return a {@link forge.Color} object. * @return a {@link forge.Color} object.
*/ */
public static Color ConvertFromString(String s) { public static Color ConvertFromString(String s) {
{
if (s.equals(Constant.Color.White)) {
return Color.White;
} else if (s.equals(Constant.Color.Green)) {
return Color.Green;
} else if (s.equals(Constant.Color.Red)) {
return Color.Red;
} else if (s.equals(Constant.Color.Black)) {
return Color.Black;
} else if (s.equals(Constant.Color.Blue)) {
return Color.Blue;
}
return Color.Colorless; if (s.equals(Constant.Color.White)) {
return Color.White;
} else if (s.equals(Constant.Color.Green)) {
return Color.Green;
} else if (s.equals(Constant.Color.Red)) {
return Color.Red;
} else if (s.equals(Constant.Color.Black)) {
return Color.Black;
} else if (s.equals(Constant.Color.Blue)) {
return Color.Blue;
} }
return Color.Colorless;
} }
/** /**
* <p>ConvertManaCostToColor.</p> * <p>
* ConvertManaCostToColor.
* </p>
* *
* @param m a {@link forge.card.mana.ManaCost} object. * @param m
* a {@link forge.card.mana.ManaCost} object.
* @return a {@link java.util.EnumSet} object. * @return a {@link java.util.EnumSet} object.
*/ */
public static EnumSet<Color> ConvertManaCostToColor(final ManaCost m) { public static EnumSet<Color> ConvertManaCostToColor(final ManaCost m) {
@@ -117,7 +141,9 @@ public enum Color {
} }
/** /**
* <p>toString.</p> * <p>
* toString.
* </p>
* *
* @return a {@link java.lang.String} object. * @return a {@link java.lang.String} object.
*/ */

View File

@@ -5,25 +5,29 @@ import java.util.ArrayList;
import forge.card.mana.ManaCost; import forge.card.mana.ManaCost;
/** /**
* class ColorChanger. * class ColorChanger. TODO Write javadoc for this type.
* TODO Write javadoc for this type.
* *
*/ */
public class ColorChanger { public class ColorChanger {
private ArrayList<Card_Color> globalColorChanges = new ArrayList<Card_Color>(); private ArrayList<Card_Color> globalColorChanges = new ArrayList<Card_Color>();
/** /**
* <p>addColorChanges.</p> * <p>
* addColorChanges.
* </p>
* *
* @param s a {@link java.lang.String} object. * @param s
* @param c a {@link forge.Card} object. * a {@link java.lang.String} object.
* @param addToColors a boolean. * @param c
* @param bIncrease a boolean. * a {@link forge.Card} object.
* @param addToColors
* a boolean.
* @param bIncrease
* a boolean.
* @return a long. * @return a long.
*/ */
public final long addColorChanges(final String s, final Card c, final boolean addToColors, public final long addColorChanges(final String s,
final boolean bIncrease) final Card c, final boolean addToColors, final boolean bIncrease)
{ {
if (bIncrease) { if (bIncrease) {
Card_Color.increaseTimestamp(); Card_Color.increaseTimestamp();
@@ -33,12 +37,18 @@ public class ColorChanger {
} }
/** /**
* <p>removeColorChanges.</p> * <p>
* removeColorChanges.
* </p>
* *
* @param s a {@link java.lang.String} object. * @param s
* @param c a {@link forge.Card} object. * a {@link java.lang.String} object.
* @param addTo a boolean. * @param c
* @param timestamp a long. * a {@link forge.Card} object.
* @param addTo
* a boolean.
* @param timestamp
* a long.
*/ */
public final void removeColorChanges(final String s, final Card c, final boolean addTo, final long timestamp) { public final void removeColorChanges(final String s, final Card c, final boolean addTo, final long timestamp) {
Card_Color removeCol = null; Card_Color removeCol = null;
@@ -54,14 +64,18 @@ public class ColorChanger {
} }
/** /**
* <p>reset = clearColorChanges.</p> * <p>
* reset = clearColorChanges.
* </p>
*/ */
public final void reset() { public final void reset() {
clearColorChanges(); clearColorChanges();
} }
/** /**
* <p>clearColorChanges.</p> * <p>
* clearColorChanges.
* </p>
*/ */
public final void clearColorChanges() { public final void clearColorChanges() {
// clear the global color changes at end of each game // clear the global color changes at end of each game
@@ -69,7 +83,9 @@ public class ColorChanger {
} }
/** /**
* <p>getColorChanges.</p> * <p>
* getColorChanges.
* </p>
* *
* @return a {@link java.util.ArrayList} object. * @return a {@link java.util.ArrayList} object.
*/ */

View File

@@ -1,12 +1,21 @@
package forge; package forge;
import java.util.*; import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import forge.Constant.Zone; import forge.Constant.Zone;
/** /**
* <p>Combat class.</p> * <p>
* Combat class.
* </p>
* *
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
@@ -20,7 +29,8 @@ public class Combat {
private HashMap<Card, CardList> unblockedMap = new HashMap<Card, CardList>(); private HashMap<Card, CardList> unblockedMap = new HashMap<Card, CardList>();
private HashMap<Card, Integer> defendingDamageMap = new HashMap<Card, Integer>(); private HashMap<Card, Integer> defendingDamageMap = new HashMap<Card, Integer>();
// Defenders are the Defending Player + Each Planeswalker that player controls // Defenders are the Defending Player + Each Planeswalker that player
// controls
private ArrayList<Object> defenders = new ArrayList<Object>(); private ArrayList<Object> defenders = new ArrayList<Object>();
private int currentDefender = 0; private int currentDefender = 0;
private int nextDefender = 0; private int nextDefender = 0;
@@ -37,14 +47,18 @@ public class Combat {
private CardList canBlockAttackerWithLure = new CardList(); private CardList canBlockAttackerWithLure = new CardList();
/** /**
* <p>Constructor for Combat.</p> * <p>
* Constructor for Combat.
* </p>
*/ */
public Combat() { public Combat() {
// Let the Begin Turn/Untap Phase Reset Combat properly // Let the Begin Turn/Untap Phase Reset Combat properly
} }
/** /**
* <p>reset.</p> * <p>
* reset.
* </p>
*/ */
public final void reset() { public final void reset() {
resetAttackers(); resetAttackers();
@@ -69,9 +83,12 @@ public class Combat {
} }
/** /**
* <p>initiatePossibleDefenders.</p> * <p>
* initiatePossibleDefenders.
* </p>
* *
* @param defender a {@link forge.Player} object. * @param defender
* a {@link forge.Player} object.
*/ */
public final void initiatePossibleDefenders(final Player defender) { public final void initiatePossibleDefenders(final Player defender) {
defenders.add(defender); defenders.add(defender);
@@ -83,7 +100,9 @@ public class Combat {
} }
/** /**
* <p>nextDefender.</p> * <p>
* nextDefender.
* </p>
* *
* @return a {@link java.lang.Object} object. * @return a {@link java.lang.Object} object.
*/ */
@@ -99,16 +118,21 @@ public class Combat {
} }
/** /**
* <p>Setter for the field <code>currentDefender</code>.</p> * <p>
* Setter for the field <code>currentDefender</code>.
* </p>
* *
* @param def a int. * @param def
* a int.
*/ */
public final void setCurrentDefender(final int def) { public final void setCurrentDefender(final int def) {
currentDefender = def; currentDefender = def;
} }
/** /**
* <p>getRemainingDefenders.</p> * <p>
* getRemainingDefenders.
* </p>
* *
* @return a int. * @return a int.
*/ */
@@ -117,7 +141,9 @@ public class Combat {
} }
/** /**
* <p>Getter for the field <code>defenders</code>.</p> * <p>
* Getter for the field <code>defenders</code>.
* </p>
* *
* @return a {@link java.util.ArrayList} object. * @return a {@link java.util.ArrayList} object.
*/ */
@@ -126,16 +152,21 @@ public class Combat {
} }
/** /**
* <p>Setter for the field <code>defenders</code>.</p> * <p>
* Setter for the field <code>defenders</code>.
* </p>
* *
* @param newDef a {@link java.util.ArrayList} object. * @param newDef
* a {@link java.util.ArrayList} object.
*/ */
public final void setDefenders(ArrayList<Object> newDef) { public final void setDefenders(final ArrayList<Object> newDef) {
defenders = newDef; defenders = newDef;
} }
/** /**
* <p>getDefendingPlaneswalkers.</p> * <p>
* getDefendingPlaneswalkers.
* </p>
* *
* @return an array of {@link forge.Card} objects. * @return an array of {@link forge.Card} objects.
*/ */
@@ -155,7 +186,9 @@ public class Combat {
} }
/** /**
* <p>getDeclaredAttackers.</p> * <p>
* getDeclaredAttackers.
* </p>
* *
* @return a int. * @return a int.
*/ */
@@ -164,25 +197,33 @@ public class Combat {
} }
/** /**
* <p>Setter for the field <code>attackingPlayer</code>.</p> * <p>
* Setter for the field <code>attackingPlayer</code>.
* </p>
* *
* @param player a {@link forge.Player} object. * @param player
* a {@link forge.Player} object.
*/ */
public final void setAttackingPlayer(final Player player) { public final void setAttackingPlayer(final Player player) {
attackingPlayer = player; attackingPlayer = player;
} }
/** /**
* <p>Setter for the field <code>defendingPlayer</code>.</p> * <p>
* Setter for the field <code>defendingPlayer</code>.
* </p>
* *
* @param player a {@link forge.Player} object. * @param player
* a {@link forge.Player} object.
*/ */
public final void setDefendingPlayer(final Player player) { public final void setDefendingPlayer(final Player player) {
defendingPlayer = player; defendingPlayer = player;
} }
/** /**
* <p>Getter for the field <code>attackingPlayer</code>.</p> * <p>
* Getter for the field <code>attackingPlayer</code>.
* </p>
* *
* @return a {@link forge.Player} object. * @return a {@link forge.Player} object.
*/ */
@@ -191,7 +232,9 @@ public class Combat {
} }
/** /**
* <p>Getter for the field <code>defendingPlayer</code>.</p> * <p>
* Getter for the field <code>defendingPlayer</code>.
* </p>
* *
* @return a {@link forge.Player} object. * @return a {@link forge.Player} object.
*/ */
@@ -200,7 +243,9 @@ public class Combat {
} }
/** /**
* <p>Getter for the field <code>defendingDamageMap</code>.</p> * <p>
* Getter for the field <code>defendingDamageMap</code>.
* </p>
* *
* @return a {@link java.util.HashMap} object. * @return a {@link java.util.HashMap} object.
*/ */
@@ -209,7 +254,9 @@ public class Combat {
} }
/** /**
* <p>getTotalDefendingDamage.</p> * <p>
* getTotalDefendingDamage.
* </p>
* *
* @return a int. * @return a int.
*/ */
@@ -227,21 +274,22 @@ public class Combat {
} }
/** /**
* <p>setDefendingDamage.</p> * <p>
* setDefendingDamage.
* </p>
*/ */
public final void setDefendingDamage() { public final void setDefendingDamage() {
defendingDamageMap.clear(); defendingDamageMap.clear();
CardList att = new CardList(getAttackers()); CardList att = new CardList(getAttackers());
// sum unblocked attackers' power // sum unblocked attackers' power
for (int i = 0; i < att.size(); i++) { for (int i = 0; i < att.size(); i++) {
if (!isBlocked(att.get(i)) if (!isBlocked(att.get(i)) || (getBlockers(att.get(i)).size() == 0 && att.get(i).hasKeyword("Trample"))) {
|| (getBlockers(att.get(i)).size() == 0 && att.get(i).hasKeyword("Trample")))
{
int damageDealt = att.get(i).getNetCombatDamage(); int damageDealt = att.get(i).getNetCombatDamage();
if (damageDealt > 0) { if (damageDealt > 0) {
//if the creature has first strike do not do damage in the normal combat phase // if the creature has first strike do not do damage in the
// normal combat phase
if (!att.get(i).hasFirstStrike() || att.get(i).hasDoubleStrike()) { if (!att.get(i).hasFirstStrike() || att.get(i).hasDoubleStrike()) {
addDefendingDamage(damageDealt, att.get(i)); addDefendingDamage(damageDealt, att.get(i));
} }
@@ -250,9 +298,10 @@ public class Combat {
} // for } // for
} }
/** /**
* <p>setDefendingFirstStrikeDamage.</p> * <p>
* setDefendingFirstStrikeDamage.
* </p>
* *
* @return a boolean. * @return a boolean.
*/ */
@@ -267,7 +316,8 @@ public class Combat {
int damageDealt = att.get(i).getNetCombatDamage(); int damageDealt = att.get(i).getNetCombatDamage();
if (damageDealt > 0) { if (damageDealt > 0) {
// if the creature has first strike or double strike do damage in the first strike combat phase // if the creature has first strike or double strike do
// damage in the first strike combat phase
if (att.get(i).hasFirstStrike() || att.get(i).hasDoubleStrike()) { if (att.get(i).hasFirstStrike() || att.get(i).hasDoubleStrike()) {
addDefendingDamage(damageDealt, att.get(i)); addDefendingDamage(damageDealt, att.get(i));
needsFirstStrike = true; needsFirstStrike = true;
@@ -279,12 +329,15 @@ public class Combat {
return needsFirstStrike; return needsFirstStrike;
} }
/** /**
* <p>addDefendingDamage.</p> * <p>
* addDefendingDamage.
* </p>
* *
* @param n a int. * @param n
* @param source a {@link forge.Card} object. * a int.
* @param source
* a {@link forge.Card} object.
*/ */
public final void addDefendingDamage(final int n, final Card source) { public final void addDefendingDamage(final int n, final Card source) {
String slot = getDefenderByAttacker(source).toString(); String slot = getDefenderByAttacker(source).toString();
@@ -305,16 +358,21 @@ public class Combat {
} }
/** /**
* <p>addAttackingDamage.</p> * <p>
* addAttackingDamage.
* </p>
* *
* @param n a int. * @param n
* a int.
*/ */
public final void addAttackingDamage(int n) { public final void addAttackingDamage(final int n) {
attackingDamage += n; attackingDamage += n;
} }
/** /**
* <p>Getter for the field <code>attackingDamage</code>.</p> * <p>
* Getter for the field <code>attackingDamage</code>.
* </p>
* *
* @return a int. * @return a int.
*/ */
@@ -323,7 +381,9 @@ public class Combat {
} }
/** /**
* <p>sortAttackerByDefender.</p> * <p>
* sortAttackerByDefender.
* </p>
* *
* @return an array of {@link forge.CardList} objects. * @return an array of {@link forge.CardList} objects.
*/ */
@@ -343,9 +403,12 @@ public class Combat {
} }
/** /**
* <p>isAttacking.</p> * <p>
* isAttacking.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
* @return a boolean. * @return a boolean.
*/ */
public final boolean isAttacking(final Card c) { public final boolean isAttacking(final Card c) {
@@ -353,9 +416,12 @@ public class Combat {
} }
/** /**
* <p>addAttacker.</p> * <p>
* addAttacker.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
*/ */
public final void addAttacker(final Card c) { public final void addAttacker(final Card c) {
map.put(c, new CardList()); map.put(c, new CardList());
@@ -363,9 +429,12 @@ public class Combat {
} }
/** /**
* <p>getDefenderByAttacker.</p> * <p>
* getDefenderByAttacker.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
* @return a {@link java.lang.Object} object. * @return a {@link java.lang.Object} object.
*/ */
public final Object getDefenderByAttacker(final Card c) { public final Object getDefenderByAttacker(final Card c) {
@@ -373,7 +442,9 @@ public class Combat {
} }
/** /**
* <p>resetAttackers.</p> * <p>
* resetAttackers.
* </p>
*/ */
public final void resetAttackers() { public final void resetAttackers() {
map.clear(); map.clear();
@@ -381,7 +452,9 @@ public class Combat {
} }
/** /**
* <p>getAttackers.</p> * <p>
* getAttackers.
* </p>
* *
* @return an array of {@link forge.Card} objects. * @return an array of {@link forge.Card} objects.
*/ */
@@ -397,9 +470,12 @@ public class Combat {
} // getAttackers() } // getAttackers()
/** /**
* <p>isBlocked.</p> * <p>
* isBlocked.
* </p>
* *
* @param attacker a {@link forge.Card} object. * @param attacker
* a {@link forge.Card} object.
* @return a boolean. * @return a boolean.
*/ */
public final boolean isBlocked(final Card attacker) { public final boolean isBlocked(final Card attacker) {
@@ -407,10 +483,14 @@ public class Combat {
} }
/** /**
* <p>addBlocker.</p> * <p>
* addBlocker.
* </p>
* *
* @param attacker a {@link forge.Card} object. * @param attacker
* @param blocker a {@link forge.Card} object. * a {@link forge.Card} object.
* @param blocker
* a {@link forge.Card} object.
*/ */
public final void addBlocker(final Card attacker, final Card blocker) { public final void addBlocker(final Card attacker, final Card blocker) {
blocked.add(attacker); blocked.add(attacker);
@@ -418,7 +498,9 @@ public class Combat {
} }
/** /**
* <p>resetBlockers.</p> * <p>
* resetBlockers.
* </p>
*/ */
public final void resetBlockers() { public final void resetBlockers() {
reset(); reset();
@@ -430,7 +512,9 @@ public class Combat {
} }
/** /**
* <p>getAllBlockers.</p> * <p>
* getAllBlockers.
* </p>
* *
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
@@ -446,9 +530,12 @@ public class Combat {
} // getAllBlockers() } // getAllBlockers()
/** /**
* <p>getBlockers.</p> * <p>
* getBlockers.
* </p>
* *
* @param attacker a {@link forge.Card} object. * @param attacker
* a {@link forge.Card} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList getBlockers(final Card attacker) { public final CardList getBlockers(final Card attacker) {
@@ -460,9 +547,12 @@ public class Combat {
} }
/** /**
* <p>getAttackerBlockedBy.</p> * <p>
* getAttackerBlockedBy.
* </p>
* *
* @param blocker a {@link forge.Card} object. * @param blocker
* a {@link forge.Card} object.
* @return a {@link forge.Card} object. * @return a {@link forge.Card} object.
*/ */
public final Card getAttackerBlockedBy(final Card blocker) { public final Card getAttackerBlockedBy(final Card blocker) {
@@ -478,9 +568,12 @@ public class Combat {
} }
/** /**
* <p>getList.</p> * <p>
* getList.
* </p>
* *
* @param attacker a {@link forge.Card} object. * @param attacker
* a {@link forge.Card} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
private CardList getList(final Card attacker) { private CardList getList(final Card attacker) {
@@ -488,9 +581,12 @@ public class Combat {
} }
/** /**
* <p>removeFromCombat.</p> * <p>
* removeFromCombat.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
*/ */
public final void removeFromCombat(final Card c) { public final void removeFromCombat(final Card c) {
// is card an attacker? // is card an attacker?
@@ -502,7 +598,8 @@ public class Combat {
for (Card a : att) { for (Card a : att) {
if (getBlockers(a).contains(c)) { if (getBlockers(a).contains(c)) {
getList(a).remove(c); getList(a).remove(c);
// TODO if Declare Blockers and Declare Blockers (Abilities) merge this logic needs to be tweaked // TODO if Declare Blockers and Declare Blockers (Abilities)
// merge this logic needs to be tweaked
if (getBlockers(a).size() == 0 && AllZone.getPhase().is(Constant.Phase.Combat_Declare_Blockers)) { if (getBlockers(a).size() == 0 && AllZone.getPhase().is(Constant.Phase.Combat_Declare_Blockers)) {
blocked.remove(a); blocked.remove(a);
} }
@@ -514,9 +611,11 @@ public class Combat {
} // removeFromCombat() } // removeFromCombat()
/** /**
* <p>verifyCreaturesInPlay.</p> * <p>
* verifyCreaturesInPlay.
* </p>
*/ */
public void verifyCreaturesInPlay() { public final void verifyCreaturesInPlay() {
CardList all = new CardList(); CardList all = new CardList();
all.addAll(getAttackers()); all.addAll(getAttackers());
all.addAll(getAllBlockers()); all.addAll(getAllBlockers());
@@ -529,7 +628,9 @@ public class Combat {
} // verifyCreaturesInPlay() } // verifyCreaturesInPlay()
/** /**
* <p>setUnblocked.</p> * <p>
* setUnblocked.
* </p>
*/ */
public final void setUnblocked() { public final void setUnblocked() {
CardList attacking = new CardList(getAttackers()); CardList attacking = new CardList(getAttackers());
@@ -538,10 +639,10 @@ public class Combat {
CardList block = getBlockers(attacker); CardList block = getBlockers(attacker);
if (block.size() == 0) { if (block.size() == 0) {
// this damage is assigned to a player by setPlayerDamage() // this damage is assigned to a player by setPlayerDamage()
addUnblockedAttacker(attacker); addUnblockedAttacker(attacker);
//Run Unblocked Trigger // Run Unblocked Trigger
HashMap<String, Object> runParams = new HashMap<String, Object>(); HashMap<String, Object> runParams = new HashMap<String, Object>();
runParams.put("Attacker", attacker); runParams.put("Attacker", attacker);
AllZone.getTriggerHandler().runTrigger("AttackerUnblocked", runParams); AllZone.getTriggerHandler().runTrigger("AttackerUnblocked", runParams);
@@ -553,7 +654,9 @@ public class Combat {
// set Card.setAssignedDamage() for all creatures in combat // set Card.setAssignedDamage() for all creatures in combat
// also assigns player damage by setPlayerDamage() // also assigns player damage by setPlayerDamage()
/** /**
* <p>setAssignedFirstStrikeDamage.</p> * <p>
* setAssignedFirstStrikeDamage.
* </p>
* *
* @return a boolean. * @return a boolean.
*/ */
@@ -582,7 +685,8 @@ public class Combat {
} }
if (block.size() == 0) { if (block.size() == 0) {
// this damage is assigned to a player by setDefendingFirstStrikeDamage() // this damage is assigned to a player by
// setDefendingFirstStrikeDamage()
} else if (attacker.hasFirstStrike() || attacker.hasDoubleStrike()) { } else if (attacker.hasFirstStrike() || attacker.hasDoubleStrike()) {
needFirstStrike = true; needFirstStrike = true;
if (getAttackingPlayer().isHuman()) { // human attacks if (getAttackingPlayer().isHuman()) { // human attacks
@@ -602,7 +706,9 @@ public class Combat {
// set Card.setAssignedDamage() for all creatures in combat // set Card.setAssignedDamage() for all creatures in combat
// also assigns player damage by setPlayerDamage() // also assigns player damage by setPlayerDamage()
/** /**
* <p>setAssignedDamage.</p> * <p>
* setAssignedDamage.
* </p>
*/ */
public final void setAssignedDamage() { public final void setAssignedDamage() {
setDefendingDamage(); setDefendingDamage();
@@ -646,11 +752,16 @@ public class Combat {
} // assignDamage() } // assignDamage()
/** /**
* <p>distributeAIDamage.</p> * <p>
* distributeAIDamage.
* </p>
* *
* @param attacker a {@link forge.Card} object. * @param attacker
* @param block a {@link forge.CardList} object. * a {@link forge.Card} object.
* @param damage a int. * @param block
* a {@link forge.CardList} object.
* @param damage
* a int.
*/ */
private void distributeAIDamage(final Card attacker, final CardList block, int damage) { private void distributeAIDamage(final Card attacker, final CardList block, int damage) {
Card c = attacker; Card c = attacker;
@@ -664,7 +775,8 @@ public class Combat {
int damageNeeded = 0; int damageNeeded = 0;
//TODO if the human can be killed distribute only the minimum of damage to the blocker // TODO if the human can be killed distribute only the minimum
// of damage to the blocker
damageNeeded = blocker.getEnoughDamageToKill(damage, attacker, true); damageNeeded = blocker.getEnoughDamageToKill(damage, attacker, true);
@@ -676,7 +788,8 @@ public class Combat {
int trample = damage - damageNeeded; int trample = damage - damageNeeded;
// If Extra trample damage, assign to defending player/planeswalker // If Extra trample damage, assign to defending
// player/planeswalker
if (0 < trample) { if (0 < trample) {
this.addDefendingDamage(trample, attacker); this.addDefendingDamage(trample, attacker);
} }
@@ -687,7 +800,8 @@ public class Combat {
} }
} // 1 blocker } // 1 blocker
else { else {
boolean killsAllBlockers = true; //Does the attacker deal lethal damage to all blockers boolean killsAllBlockers = true; // Does the attacker deal lethal
// damage to all blockers
for (Card b : block) { for (Card b : block) {
int enoughDamageToKill = b.getEnoughDamageToKill(damage, attacker, true); int enoughDamageToKill = b.getEnoughDamageToKill(damage, attacker, true);
if (enoughDamageToKill <= damage) { if (enoughDamageToKill <= damage) {
@@ -701,23 +815,23 @@ public class Combat {
} }
} // for } // for
// if attacker has no trample, and there's damage left, assign the rest // if attacker has no trample, and there's damage left, assign the
// rest
// to a random blocker // to a random blocker
if (damage > 0 if (damage > 0 && !(c.hasKeyword("Trample") && killsAllBlockers)) {
&& !(c.hasKeyword("Trample")
&& killsAllBlockers == true)) {
int index = CardUtil.getRandomIndex(block); int index = CardUtil.getRandomIndex(block);
block.get(index).addAssignedDamage(damage, c); block.get(index).addAssignedDamage(damage, c);
damage = 0; damage = 0;
} else if (c.hasKeyword("Trample") } else if (c.hasKeyword("Trample") && killsAllBlockers) {
&& killsAllBlockers == true) {
this.addDefendingDamage(damage, c); this.addDefendingDamage(damage, c);
} }
} }
} // setAssignedDamage() } // setAssignedDamage()
/** /**
* <p>dealAssignedDamage.</p> * <p>
* dealAssignedDamage.
* </p>
*/ */
public static void dealAssignedDamage() { public static void dealAssignedDamage() {
// This function handles both Regular and First Strike combat assignment // This function handles both Regular and First Strike combat assignment
@@ -731,8 +845,8 @@ public class Combat {
player.addCombatDamage(entry.getValue(), entry.getKey()); player.addCombatDamage(entry.getValue(), entry.getKey());
} }
CardList unblocked = new CardList(bFirstStrike ? AllZone.getCombat().getUnblockedAttackers() : CardList unblocked = new CardList(bFirstStrike ? AllZone.getCombat().getUnblockedAttackers() : AllZone
AllZone.getCombat().getUnblockedFirstStrikeAttackers()); .getCombat().getUnblockedFirstStrikeAttackers());
for (int j = 0; j < unblocked.size(); j++) { for (int j = 0; j < unblocked.size(); j++) {
if (bFirstStrike) { if (bFirstStrike) {
@@ -773,14 +887,18 @@ public class Combat {
c.clearAssignedDamage(); c.clearAssignedDamage();
} }
//This was deeper before, but that resulted in the stack entry acting like before. // This was deeper before, but that resulted in the stack entry acting
// like before.
} }
/** /**
* <p>isUnblocked.</p> * <p>
* isUnblocked.
* </p>
* *
* @param att a {@link forge.Card} object. * @param att
* a {@link forge.Card} object.
* @return a boolean. * @return a boolean.
*/ */
public final boolean isUnblocked(final Card att) { public final boolean isUnblocked(final Card att) {
@@ -788,7 +906,9 @@ public class Combat {
} }
/** /**
* <p>getUnblockedAttackers.</p> * <p>
* getUnblockedAttackers.
* </p>
* *
* @return an array of {@link forge.Card} objects. * @return an array of {@link forge.Card} objects.
*/ */
@@ -807,7 +927,9 @@ public class Combat {
} // getUnblockedAttackers() } // getUnblockedAttackers()
/** /**
* <p>getUnblockedFirstStrikeAttackers.</p> * <p>
* getUnblockedFirstStrikeAttackers.
* </p>
* *
* @return an array of {@link forge.Card} objects. * @return an array of {@link forge.Card} objects.
*/ */
@@ -826,9 +948,12 @@ public class Combat {
} // getUnblockedAttackers() } // getUnblockedAttackers()
/** /**
* <p>addUnblockedAttacker.</p> * <p>
* addUnblockedAttacker.
* </p>
* *
* @param c a {@link forge.Card} object. * @param c
* a {@link forge.Card} object.
*/ */
public final void addUnblockedAttacker(final Card c) { public final void addUnblockedAttacker(final Card c) {
unblockedMap.put(c, new CardList()); unblockedMap.put(c, new CardList());

File diff suppressed because it is too large Load Diff