package com.idunnolol.sotm.data; import android.content.Context; import android.os.Parcel; import android.os.Parcelable; import com.idunnolol.sotm.R; import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class Card implements Parcelable { private static final String ADVANCED_POSTFIX = " (Advanced)"; private static final String RANDOM_ID = "Random"; // Minimum number of advanced games counted before we will use it private static final int ADVANCED_COUNT_MINIMUM = 50; public static final Card RANDOM_HERO = new Card(Type.HERO, RANDOM_ID, R.string.card_random_hero, 0); public static final Card RANDOM_VILLAIN = new Card(Type.VILLAIN, RANDOM_ID, R.string.card_random_villain, 0); public static final Card RANDOM_ENVIRONMENT = new Card(Type.ENVIRONMENT, RANDOM_ID, R.string.card_random_environment, 0); public static enum Type { HERO, VILLAIN, ENVIRONMENT, } private Type mType; private String mId; private int mNameResId; private int mIconResId; private int mPoints; private boolean mEnabled; private boolean mAdvanced; private int mAdvancedPoints; // If this is an advanced card, this is the # of advanced games logged // with the card. We want to cut off a low # because of how unreliable // the data can be. private int mAdvancedCount; /** * Some "cards" are actually a set of cards, i.e. the Vengeance Five. */ private List<Card> mTeam; public Card() { // Default constructor } public Card(Type type, String id, int nameResId, int points) { mType = type; mId = id; mNameResId = nameResId; mPoints = points; mEnabled = true; } public Card(Card other) { mType = other.mType; mId = other.mId; mNameResId = other.mNameResId; mIconResId = other.mIconResId; mPoints = other.mPoints; mEnabled = other.mEnabled; mAdvanced = other.mAdvanced; mAdvancedPoints = other.mAdvancedPoints; mAdvancedCount = other.mAdvancedCount; } public Type getType() { return mType; } public void setType(Type type) { mType = type; } public String getId() { return mId; } public void setId(String id) { mId = id; } public void setNameResId(int resId) { mNameResId = resId; } public int getNameResId() { return mNameResId; } public CharSequence getName(Context context) { CharSequence name = context.getString(mNameResId); return mAdvanced ? context.getString(R.string.advanced_TEMPLATE, name) : name; } public void setIconResId(int resId) { mIconResId = resId; } public int getIconResId() { return mIconResId; } public int getPoints() { return mPoints; } public void setPoints(int points) { mPoints = points; } public boolean isEnabled() { return mEnabled && (!isAdvanced() || canBeAdvanced()); } public void setEnabled(boolean enabled) { mEnabled = enabled; } public boolean isAdvanced() { return mAdvanced; } public void makeAdvanced() { mAdvanced = true; mId = getAdvancedId(); } public void setAdvancedPoints(int advancedPoints) { mAdvancedPoints = advancedPoints; } public int getAdvancedPoints() { if (mAdvancedPoints == 0) { return mPoints; } return mAdvancedPoints; } public void setAdvancedCount(int count) { mAdvancedCount = count; } public int getAdvancedCount() { return mAdvancedCount; } public boolean canBeAdvanced() { return mAdvancedCount >= ADVANCED_COUNT_MINIMUM && Prefs.isAdvancedAllowed(); } public void addTeamMember(Card teamMember) { if (mTeam == null) { mTeam = new ArrayList<Card>(); } mTeam.add(teamMember); } public boolean isTeam() { return mTeam != null; } public List<Card> getTeamMembers() { return mTeam; } public boolean isRandom() { return mId.equals(RANDOM_ID) || isTeam(); } /** * @return the advanced version of this card */ public String getAdvancedId() { if (mId.endsWith(ADVANCED_POSTFIX)) { return mId; } else { return mId + ADVANCED_POSTFIX; } } @Override public int hashCode() { return mId.hashCode(); } @Override public boolean equals(Object o) { if (!(o instanceof Card)) { return false; } Card other = (Card) o; return mId.equals(other.mId); } @Override public String toString() { return mId; } ////////////////////////////////////////////////////////////////////////// // Comparators public static final Comparator<Card> POINT_COMPARATOR = new Comparator<Card>() { @Override public int compare(Card lhs, Card rhs) { return lhs.getPoints() - rhs.getPoints(); } }; public static final Comparator<Card> POINT_ADVANCED_COMPARATOR = new Comparator<Card>() { @Override public int compare(Card lhs, Card rhs) { return lhs.getAdvancedPoints() - rhs.getAdvancedPoints(); } }; public static Comparator<Card> getNameComparator(final Context context) { return new Comparator<Card>() { public int compare(Card lhs, Card rhs) { String lhName = context.getString(lhs.getNameResId()); String rhName = context.getString(rhs.getNameResId()); int comp = lhName.compareTo(rhName); // When comparing names, advanced always comes below the // non-advanced version of the card. if (comp == 0) { if (lhs.isAdvanced()) { return 1; } else if (rhs.isAdvanced()) { return -1; } } return comp; } }; } ////////////////////////////////////////////////////////////////////////// // Parcelable private Card(Parcel in) { boolean hasType = in.readByte() == 1; if (hasType) { mType = Type.values()[in.readInt()]; } mId = in.readString(); mNameResId = in.readInt(); mIconResId = in.readInt(); mPoints = in.readInt(); mEnabled = in.readByte() == 1; mAdvanced = in.readByte() == 1; mAdvancedPoints = in.readInt(); mAdvancedCount = in.readInt(); mTeam = in.readArrayList(getClass().getClassLoader()); } @Override public void writeToParcel(Parcel dest, int flags) { if (mType != null) { dest.writeByte((byte) 1); dest.writeInt(mType.ordinal()); } else { dest.writeByte((byte) 0); } dest.writeString(mId); dest.writeInt(mNameResId); dest.writeInt(mIconResId); dest.writeInt(mPoints); dest.writeByte((byte) (mEnabled ? 1 : 0)); dest.writeByte((byte) (mAdvanced ? 1 : 0)); dest.writeInt(mAdvancedPoints); dest.writeInt(mAdvancedCount); dest.writeList(mTeam); } @Override public int describeContents() { return 0; } public static final Parcelable.Creator<Card> CREATOR = new Parcelable.Creator<Card>() { public Card createFromParcel(Parcel in) { return new Card(in); } public Card[] newArray(int size) { return new Card[size]; } }; }