package forge;
import com.esotericsoftware.minlog.Log;
import forge.card.cardFactory.CardFactoryUtil;
import java.util.ArrayList;
import java.util.Comparator;
/**
* <p>CardListUtil class.</p>
*
* @author Forge
* @version $Id: $
*/
public class CardListUtil {
/**
* <p>filterToughness.</p>
*
* @param in a {@link forge.CardList} object.
* @param atLeastToughness a int.
* @return a {@link forge.CardList} object.
*/
public static CardList filterToughness(CardList in, int atLeastToughness) {
CardList out = new CardList();
for (int i = 0; i < in.size(); i++)
if (in.get(i).getNetDefense() <= atLeastToughness)
out.add(in.get(i));
return out;
}
//the higher the defense the better
/**
* <p>sortDefense.</p>
*
* @param list a {@link forge.CardList} object.
*/
public static void sortDefense(CardList list) {
Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) {
return b.getNetDefense() - a.getNetDefense();
}
};
list.sort(com);
}//sortDefense()
//the higher the attack the better
/**
* <p>sortAttack.</p>
*
* @param list a {@link forge.CardList} object.
*/
public static void sortAttack(CardList list) {
Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) {
if (CombatUtil.isDoranInPlay())
return b.getNetDefense() - a.getNetDefense();
else
return b.getNetAttack() - a.getNetAttack();
}
};
list.sort(com);
}//sortAttack()
// sort by "best" using the EvaluateCreature function
// the best creatures will be first in the list
/**
* <p>sortByEvaluateCreature.</p>
*
* @param list a {@link forge.CardList} object.
*/
public static void sortByEvaluateCreature(CardList list) {
Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) {
return CardFactoryUtil.evaluateCreature(b) - CardFactoryUtil.evaluateCreature(a);
}
};
list.sort(com);
}//sortByEvaluateCreature()
// sort by "best" using the EvaluateCreature function
// the best creatures will be first in the list
/**
* <p>sortByMostExpensive.</p>
*
* @param list a {@link forge.CardList} object.
*/
public static void sortByMostExpensive(CardList list) {
Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) {
return b.getCMC() - a.getCMC();
}
};
list.sort(com);
}//sortByEvaluateCreature()
//the lower the attack the better
/**
* <p>sortAttackLowFirst.</p>
*
* @param list a {@link forge.CardList} object.
*/
public static void sortAttackLowFirst(CardList list) {
Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) {
if (CombatUtil.isDoranInPlay())
return a.getNetDefense() - b.getNetDefense();
else
return a.getNetAttack() - b.getNetAttack();
}
};
list.sort(com);
}//sortAttackLowFirst()
/**
* <p>sortNonFlyingFirst.</p>
*
* @param list a {@link forge.CardList} object.
*/
public static void sortNonFlyingFirst(CardList list) {
sortFlying(list);
list.reverse();
}//sortNonFlyingFirst
//the creature with flying are better
/**
* <p>sortFlying.</p>
*
* @param list a {@link forge.CardList} object.
*/
public static void sortFlying(CardList list) {
Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) {
if (a.hasKeyword("Flying") && b.hasKeyword("Flying"))
return 0;
else if (a.hasKeyword("Flying"))
return -1;
else if (b.hasKeyword("Flying"))
return 1;
return 0;
}
};
list.sort(com);
}//sortFlying()
//sort by keyword
/**
* <p>sortByKeyword.</p>
*
* @param list a {@link forge.CardList} object.
* @param kw a {@link java.lang.String} object.
*/
public static void sortByKeyword(CardList list, String kw) {
final String keyword = kw;
Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) {
if (a.hasKeyword(keyword) && b.hasKeyword(keyword))
return 0;
else if (a.hasKeyword(keyword))
return -1;
else if (b.hasKeyword(keyword))
return 1;
return 0;
}
};
list.sort(com);
}//sortByKeyword()
/**
* <p>sortByDestroyEffect.</p>
*
* @param list a {@link forge.CardList} object.
*/
public static void sortByDestroyEffect(CardList list) {
Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) {
ArrayList<String> aKeywords = a.getKeyword();
ArrayList<String> bKeywords = b.getKeyword();
boolean aContains = false;
boolean bContains = false;
for (String kw : aKeywords) {
if (kw.startsWith("Whenever") && kw.contains("into a graveyard from the battlefield,")) {
aContains = true;
break;
}
}
for (String kw : bKeywords) {
if (kw.startsWith("Whenever") && kw.contains("into a graveyard from the battlefield,")) {
bContains = true;
break;
}
}
if (aContains && bContains)
return 0;
else if (aContains)
return 1;
else if (bContains)
return -1;
return 0;
}
};
list.sort(com);
}
/**
* <p>sortByIndestructible.</p>
*
* @param list a {@link forge.CardList} object.
*/
public static void sortByIndestructible(CardList list) {
final ArrayList<String> arrList = new ArrayList<String>();
arrList.add("Timber Protector");
arrList.add("Eldrazi Monument");
Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) {
if (arrList.contains(a.getName()) && arrList.contains(b.getName()))
return 0;
else if (arrList.contains(a.getName()))
return 1;
else if (arrList.contains(b.getName()))
return -1;
return 0;
}
};
list.sort(com);
}
/**
* <p>sortByTapped.</p>
*
* @param list a {@link forge.CardList} object.
*/
public static void sortByTapped(CardList list) {
Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) {
if (a.isTapped() && b.isTapped())
return 0;
else if (a.isTapped())
return 1;
else if (b.isTapped())
return -1;
return 0;
}
};
list.sort(com);
}
/**
* <p>sortByName.</p>
*
* @param list a {@link forge.CardList} object.
*/
public static void sortByName(CardList list) {
Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) {
String aName = a.getName();
String bName = b.getName();
return aName.compareTo(bName);
}
};
list.sort(com);
}
/**
* <p>sortBySelectable.</p>
*
* @param list a {@link forge.CardList} object.
* @param type a {@link java.lang.String} object.
*/
public static void sortBySelectable(CardList list, String type) {
final String t = type;
Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) {
if (a.isType(t)
&& b.isType(t))
return 0;
else if (a.hasKeyword(t))
return 1;
else if (b.hasKeyword(t))
return -1;
return 0;
}
};
list.sort(com);
}
/**
* <p>sortByTextLen.</p>
*
* @param list a {@link forge.CardList} object.
*/
public static void sortByTextLen(CardList list) {
Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) {
int aLen = a.getText().length();
int bLen = b.getText().length();
if (aLen == bLen)
return 0;
else if (aLen > bLen)
return 1;
else if (bLen > aLen)
return -1;
return 0;
}
};
list.sort(com);
}
//Sorts from high to low
/**
* <p>sortCMC.</p>
*
* @param list a {@link forge.CardList} object.
*/
public static void sortCMC(CardList list) {
Comparator<Card> com = new Comparator<Card>() {
public int compare(Card a, Card b) {
int cmcA = CardUtil.getConvertedManaCost(a.getManaCost());
int cmcB = CardUtil.getConvertedManaCost(b.getManaCost());
if (cmcA == cmcB)
return 0;
if (cmcA > cmcB)
return -1;
if (cmcB > cmcA)
return 1;
return 0;
}
};
list.sort(com);
}//sortCMC
/**
* <p>getColor.</p>
*
* @param list a {@link forge.CardList} object.
* @param color a {@link java.lang.String} object.
* @return a {@link forge.CardList} object.
*/
public static CardList getColor(CardList list, final String color) {
return list.filter(new CardListFilter() {
public boolean addCard(Card c) {
return CardUtil.getColors(c).contains(color);
}
});
}//getColor()
/**
* <p>getGoldCards.</p>
*
* @param list a {@link forge.CardList} object.
* @return a {@link forge.CardList} object.
*/
public static CardList getGoldCards(CardList list) {
return list.filter(new CardListFilter() {
public boolean addCard(Card c) {
return CardUtil.getColors(c).size() >= 2;
}
});
}
/**
* <p>sumAttack.</p>
*
* @param c a {@link forge.CardList} object.
* @return a int.
*/
public static int sumAttack(CardList c) {
int attack = 0;
for (int i = 0; i < c.size(); i++) {
//if(c.get(i).isCreature() && c.get(i).hasSecondStrike()) {
if (c.get(i).isCreature() && (!c.get(i).hasFirstStrike() || (c.get(i).hasDoubleStrike() && c.get(i).hasFirstStrike()))) {
attack += c.get(i).getNetCombatDamage();
}
}
//System.out.println("Total attack: " +attack);
return attack;
}//sumAttack()
/**
* <p>sumDefense.</p>
*
* @param c a {@link forge.CardList} object.
* @return a int.
*/
public static int sumDefense(CardList c) {
int defense = 0;
for (int i = 0; i < c.size(); i++) {
//if(c.get(i).isCreature() && c.get(i).hasSecondStrike()) {
if (c.get(i).isCreature())
defense += c.get(i).getNetDefense();
}
//System.out.println("Total attack: " +attack);
return defense;
}//sumAttack()
/**
* <p>sumFirstStrikeAttack.</p>
*
* @param c a {@link forge.CardList} object.
* @return a int.
*/
public static int sumFirstStrikeAttack(CardList c) {
int attack = 0;
for (int i = 0; i < c.size(); i++) {
if (c.get(i).isCreature() && (c.get(i).hasFirstStrike() || c.get(i).hasDoubleStrike())) {
attack += c.get(i).getNetCombatDamage();
}
}
Log.debug("Total First Strike attack: " + attack);
return attack;
}//sumFirstStrikeAttack()
//Get the total converted mana cost of a card list
/**
* <p>sumCMC.</p>
*
* @param c a {@link forge.CardList} object.
* @return a int.
*/
public static int sumCMC(CardList c) {
int cmc = 0;
for (int i = 0; i < c.size(); i++) {
cmc += CardUtil.getConvertedManaCost(c.get(i).getManaCost());
}
//System.out.println("Total CMC: " +cmc);
return cmc;
}//sumCMC
}