package com.vdom.core; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.Iterator; import com.vdom.api.Card; import com.vdom.api.GameEvent; public class CardList implements Iterable<Card> { ArrayList<Card> a = new ArrayList<Card>(); Player player; String name; public CardList(Player player, String name) { this.player = player; this.name = name; if (player == null) { Util.log("ERROR:Trying to create CardList " + name + " for null player"); Thread.dumpStack(); } } public boolean checkValid() { boolean isValid = true; for (Card card : a) isValid = checkValid(card) ? isValid : false; return isValid; } public boolean checkValid(Card card) { if (!(card == null || card.isTemplateCard())) return true; if (card == null) { Util.playerError(player, name + " contains null card.", true); } else { Util.playerError(player, "Trying to add template card to " + name, true); } return false; } public boolean contains(Card card) { return a.contains(card); } public Card get(int i) { return a.get(i); } public Card get(Card card) { for (Card c : a) if (c.equals(card)) return c; return null; } public int indexOf(Integer id) { for (int i = a.size() - 1; i >= 0 ; i--) { if (a.get(i).getId() == id) return i; } return -1; } public Card removeCard(Card card, boolean showUI) { int idx = indexOf(card.getId()); this.remove(idx, showUI); return card; } public Card removeCard(Card card) { return removeCard(card, false); } public boolean remove(Card card) { return a.remove(card); } public Card remove(int i) { return remove(i, true); } public Card remove(int i, boolean showUI) { Card card = a.remove(i); if (showUI && name.equals("Hand")) { MoveContext context = new MoveContext(player.game, player); GameEvent event = new GameEvent(GameEvent.Type.CardRemovedFromHand, context); event.card = card; player.game.broadcastEvent(event); } return card; } public void add(Card card) { add(card, false, -1); } public void add(int index, Card card) { add(card, false, index); } public void add(Card card, boolean showUI) { add(card, showUI, -1); } public void add(Card card, boolean showUI, int index) { if (checkValid(card)) { if (index != -1) a.add(index, card); else a.add(card); if (showUI && name.equals("Hand")) { MoveContext context = new MoveContext(player.game, player); GameEvent event = new GameEvent(GameEvent.Type.CardAddedToHand, context); event.card = card; player.game.broadcastEvent(event); } } } public int size() { return a.size(); } public Card[] toArray() { return a.toArray(new Card[0]); } public ArrayList<Card> toArrayList() { return a; } @SuppressWarnings("unchecked") public ArrayList<Card> toArrayListClone() { return (ArrayList<Card>) a.clone(); } public boolean isEmpty() { return size() == 0; } public void clear() { a.clear(); } public Iterator<Card> iterator() { return a.iterator(); } public int indexOf(Card card) { return a.indexOf(card); } public int lastIndexOf(Card card) { return a.lastIndexOf(card); } public Card getLastCard() { return a.size() == 0 ? null : a.get(a.size()-1); } public Card removeLastCard() { return a.size() == 0 ? null : a.remove(a.size()-1); } public Card[] sort(Comparator<Card> comp) { Card[] sorted = this.toArray(); Arrays.sort(sorted, comp); return sorted; } }