package forge.deck;
import forge.Card;
import forge.Constant;
import java.io.Serializable;
import java.util.*;
/**
* <p>Deck class.</p>
*
* @author Forge
* @version $Id: $
*/
public class Deck implements Comparable<Deck>, Serializable {
/**
*
*/
private static final long serialVersionUID = -7478025567887481994L;
//gameType is from Constant.GameType, like Constant.GameType.Regular
private Map<String, String> metadata = new HashMap<String, String>();
private List<String> main;
private List<String> sideboard;
/** Constant <code>NAME="Name"</code> */
public static final String NAME = "Name";
/** Constant <code>DECK_TYPE="Deck Type"</code> */
public static final String DECK_TYPE = "Deck Type";
/** Constant <code>COMMENT="Comment"</code> */
public static final String COMMENT = "Comment";
/** Constant <code>DESCRIPTION="Description"</code> */
public static final String DESCRIPTION = "Description";
/** Constant <code>DIFFICULTY="Difficulty"</code> */
public static final String DIFFICULTY = "Difficulty";
//gameType is from Constant.GameType, like Constant.GameType.Regular
/**
* <p>Constructor for Deck.</p>
*/
public Deck() {
main = new ArrayList<String>();
sideboard = new ArrayList<String>();
}
/**
* <p>Constructor for Deck.</p>
*
* @param deckType a {@link java.lang.String} object.
* @param main a {@link java.util.List} object.
* @param sideboard a {@link java.util.List} object.
* @param name a {@link java.lang.String} object.
*/
public Deck(String deckType, List<String> main, List<String> sideboard, String name) {
setDeckType(deckType);
setName(name);
this.main = main;
this.sideboard = sideboard;
}
/**
* <p>Constructor for Deck.</p>
*
* @param type a {@link java.lang.String} object.
*/
public Deck(String type) {
this();
setDeckType(type);
}
/**
* <p>Getter for the field <code>main</code>.</p>
*
* @return a {@link java.util.List} object.
*/
public List<String> getMain() {
return Collections.unmodifiableList(main);
}
/**
* <p>Getter for the field <code>sideboard</code>.</p>
*
* @return a {@link java.util.List} object.
*/
public List<String> getSideboard() {
return Collections.unmodifiableList(sideboard);
}
/**
* <p>getDeckType.</p>
*
* @return a {@link java.lang.String} object.
*/
public String getDeckType() {
return metadata.get(DECK_TYPE);
}
//can only call this method ONCE
/**
* <p>setDeckType.</p>
*
* @param deckType a {@link java.lang.String} object.
*/
void setDeckType(String deckType) {
if (this.getDeckType() != null) {
throw new IllegalStateException(
"Deck : setDeckType() error, deck type has already been set");
}
if (!Constant.GameType.GameTypes.contains(deckType)) {
throw new RuntimeException(
"Deck : setDeckType() error, invalid deck type - " + deckType);
}
metadata.put(DECK_TYPE, deckType);
}
/**
* <p>setName.</p>
*
* @param s a {@link java.lang.String} object.
*/
public void setName(String s) {
metadata.put(NAME, s);
}
/**
* <p>getName.</p>
*
* @return a {@link java.lang.String} object.
*/
public String getName() {
return metadata.get(NAME);
}
/**
* <p>setComment.</p>
*
* @param comment a {@link java.lang.String} object.
*/
public void setComment(String comment) {
metadata.put(COMMENT, comment);
}
/**
* <p>getComment.</p>
*
* @return a {@link java.lang.String} object.
*/
public String getComment() {
return metadata.get(COMMENT);
}
/**
* <p>addMain.</p>
*
* @param cardName a {@link java.lang.String} object.
*/
public void addMain(String cardName) {
main.add(cardName);
}
/**
* <p>countMain.</p>
*
* @return a int.
*/
public int countMain() {
return main.size();
}
/**
* <p>Getter for the field <code>main</code>.</p>
*
* @param index a int.
* @return a {@link java.lang.String} object.
*/
public String getMain(int index) {
return main.get(index);
}
/**
* <p>removeMain.</p>
*
* @param index a int.
* @return a {@link java.lang.String} object.
*/
public String removeMain(int index) {
return main.remove(index);
}
/**
* <p>removeMain.</p>
*
* @param c a {@link forge.Card} object.
*/
public void removeMain(Card c) {
if (main.contains(c.getName())) {
int i = main.indexOf(c.getName());
main.remove(i);
}
}
/**
* <p>addSideboard.</p>
*
* @param cardName a {@link java.lang.String} object.
*/
public void addSideboard(String cardName) {
sideboard.add(cardName);
}
/**
* <p>countSideboard.</p>
*
* @return a int.
*/
public int countSideboard() {
return sideboard.size();
}
/**
* <p>Getter for the field <code>sideboard</code>.</p>
*
* @param index a int.
* @return a {@link java.lang.String} object.
*/
public String getSideboard(int index) {
return sideboard.get(index);
}
/**
* <p>removeSideboard.</p>
*
* @param index a int.
* @return a {@link java.lang.String} object.
*/
public String removeSideboard(int index) {
return sideboard.remove(index);
}
/**
* <p>isDraft.</p>
*
* @return a boolean.
*/
public boolean isDraft() {
return getDeckType().equals(Constant.GameType.Draft);
}
/**
* <p>isSealed.</p>
*
* @return a boolean.
*/
public boolean isSealed() {
return getDeckType().equals(Constant.GameType.Sealed);
}
/**
* <p>isRegular.</p>
*
* @return a boolean.
*/
public boolean isRegular() {
return getDeckType().equals(Constant.GameType.Constructed);
}
/**
* <p>hashCode.</p>
*
* @return a int.
*/
public int hashCode() {
return getName().hashCode();
}
/** {@inheritDoc} */
@Override
public String toString() {
return getName();
}
// The setters and getters below are for Quest decks
/**
* <p>setDifficulty.</p>
*
* @param s a {@link java.lang.String} object.
*/
public void setDifficulty(String s) {
metadata.put(DIFFICULTY, s);
}
/**
* <p>getDifficulty.</p>
*
* @return a {@link java.lang.String} object.
*/
public String getDifficulty() {
return metadata.get(DIFFICULTY);
}
/**
* <p>setDescription.</p>
*
* @param s a {@link java.lang.String} object.
*/
public void setDescription(String s) {
metadata.put(DESCRIPTION, s);
}
/**
* <p>getDescription.</p>
*
* @return a {@link java.lang.String} object.
*/
public String getDescription() {
return metadata.get(DESCRIPTION);
}
/**
* <p>compareTo.</p>
*
* @param d a {@link forge.deck.Deck} object.
* @return a int.
*/
public int compareTo(Deck d) {
return getName().compareTo(d.getName());
}
/** {@inheritDoc} */
public boolean equals(Object o) {
if (o instanceof Deck) {
Deck d = (Deck) o;
return getName().equals(d.getName());
}
return false;
}
/**
* <p>Getter for the field <code>metadata</code>.</p>
*
* @return a {@link java.util.Set} object.
*/
public Set<Map.Entry<String, String>> getMetadata() {
return metadata.entrySet();
}
/**
* <p>Getter for the field <code>metadata</code>.</p>
*
* @param key a {@link java.lang.String} object.
* @return a {@link java.lang.String} object.
* @since 1.0.15
*/
public String getMetadata(String key) {
if (metadata.containsKey(key))
return metadata.get(key);
return "";
}
/**
* <p>addMetaData.</p>
*
* @param key a {@link java.lang.String} object.
* @param value a {@link java.lang.String} object.
*/
public void addMetaData(String key, String value) {
metadata.put(key, value);
}
}