package magic.model; import java.util.Arrays; import java.util.EnumSet; import java.util.Iterator; import java.util.List; import java.util.Set; import magic.translate.MText; public enum MagicType { // these are supertypes Basic(MagicTypeStr._SBasic), Legendary(MagicTypeStr._SLegendary), Ongoing(MagicTypeStr._SOngoing), Snow(MagicTypeStr._SSnow), World(MagicTypeStr._SWorld), // these are card types Artifact(MagicTypeStr._SArtifact), Conspiracy(MagicTypeStr._SConspiracy), Creature(MagicTypeStr._SCreature), Enchantment(MagicTypeStr._SEnchantment), Instant(MagicTypeStr._SInstant), Land(MagicTypeStr._SLand), Phenomenon(MagicTypeStr._SPhenomenon), Plane(MagicTypeStr._SPlane), Planeswalker(MagicTypeStr._SPlaneswalker), Scheme(MagicTypeStr._SScheme), Sorcery(MagicTypeStr._SSorcery), Tribal(MagicTypeStr._STribal), Vanguard(MagicTypeStr._SVanguard), ; public static final Set ALL_CARD_TYPES = EnumSet.range(Artifact, Vanguard); public static final Set SUPERTYPES = EnumSet.range(Basic, World); public static final Set FILTER_TYPES = EnumSet.of( Basic, Legendary, Snow, World, Artifact, Creature, Enchantment, Instant, Land, Planeswalker, Sorcery, Tribal ); public static final List TYPE_ORDER = Arrays.asList( // Tribal first Tribal, // Priority order for combinations of Type Enchantment, Artifact, Land, Creature, // All others in use Instant, Planeswalker, Sorcery ); private final int mask; private final String displayName; private MagicType(final String aName) { this.displayName = MText.get(aName); mask = 1 << ordinal(); } public int getMask() { return mask; } public static MagicType getType(final String name) { for (final MagicType type : values()) { if (type.toString().equalsIgnoreCase(name)) { return type; } } throw new RuntimeException("No corresponding MagicType for " + name); } public static EnumSet prefixTypes(final List tokens) { final EnumSet types = EnumSet.noneOf(MagicType.class); boolean matched = true; for (Iterator iterator = tokens.iterator(); iterator.hasNext() && matched;) { final String name = iterator.next(); matched = false; for (final MagicType type : values()) { final String plural = type.toString() + "s"; if (type.toString().equalsIgnoreCase(name) || plural.equalsIgnoreCase(name)) { matched = true; types.add(type); iterator.remove(); break; } } } return types; } public static int getTypes(final String[] typeNames) { int givenTypeFlags = 0; for (final String typeName : typeNames) { givenTypeFlags |= getType(typeName).getMask(); } return givenTypeFlags; } public boolean hasType(final int flags) { return (flags & getMask()) != 0; } public String getDisplayName() { return displayName; } }