package mage; /** * Enum representing the mana symbols. * <p> * 107.4. The mana symbols are {W}, {U}, {B}, {R}, {G}, and {X}; the numerals * {0}, {1}, {2}, {3}, {4}, and so on; the hybrid symbols {W/U}, {W/B}, {U/B}, * {U/R}, {B/R}, {B/G}, {R/G}, {R/W}, {G/W}, and {G/U}; the monocolored hybrid * symbols {2/W}, {2/U}, {2/B}, {2/R}, and {2/G}; the Phyrexian mana symbols * {W/P}, {U/P}, {B/P}, {R/P}, and {G/P}; and the snow symbol {S}. * <p> * 107.4a. There are five primary colored mana symbols: {W} is white, {U} blue, * {B} black, {R} red, and {G} green. These symbols are used to represent colored * mana, and also to represent colored mana in costs. Colored mana in costs can * be paid only with the appropriate color of mana. See rule 202, "Mana Cost and * Color." * <p> * 107.4b. Numeral symbols (such as {1}) and variable symbols (such as {X}) * represent generic mana in costs. Generic mana in costs can be paid with any * type of mana. For more information about {X}, see rule 107.3. * <p> * 107.4c. Numeral symbols (such as {1}) and variable symbols (such as {X}) can * also represent colorless mana if they appear in the effect of a spell or * ability that reads "add [mana symbol] to your mana pool" or something similar. * (See rule 107.3e.) * <p> * 107.4d. The symbol {0} represents zero mana and is used as a placeholder for a * cost that can be paid with no resources. (See rule 117.5.) * <p> * 107.4e. Hybrid mana symbols are also colored mana symbols. Each one represents * a cost that can be paid in one of two ways, as represented by the two halves * of the symbol. A hybrid symbol such as {W/U} can be paid with either white or * blue mana, and a monocolored hybrid symbol such as {2/B} can be paid with * either one black mana or two mana of any type. A hybrid mana symbol is all of * its component colors. Example: {G/W}{G/W} can be paid by spending {G}{G}, * {G}{W}, or {W}{W}. * <p> * 107.4f. Phyrexian mana symbols are colored mana symbols: {W/P} is white, {U/P} * is blue, {B/P} is black, {R/P} is red, and {G/P} is green. A Phyrexian mana * symbol represents a cost that can be paid either with one mana of its color or * by paying 2 life. Example: {W/P}{W/P} can be paid by spending {W}{W}, by * spending {W} and paying 2 life, or by paying 4 life. * <p> * 107.4g. In rules text, the Phyrexian symbol {P} with no colored background * means any of the five Phyrexian mana symbols. * <p> * 107.4h. The snow mana symbol {S} represents one generic mana in a cost. This * generic mana can be paid with one mana of any type produced by a snow * permanent (see rule 205.4f). Effects that reduce the amount of generic mana * you pay don't affect {S} costs. (There is no such thing as "snow mana"; "snow" * is not a type of mana.) * * @author noxx */ public enum ManaSymbol { W("{W}", Type.PRIMARY, Type.COLORED, Type.MONOCOLORED), U("{U}", Type.PRIMARY, Type.COLORED, Type.MONOCOLORED), B("{B}", Type.PRIMARY, Type.COLORED, Type.MONOCOLORED), R("{R}", Type.PRIMARY, Type.COLORED, Type.MONOCOLORED), G("{G}", Type.PRIMARY, Type.COLORED, Type.MONOCOLORED), X("{X}", Type.GENERIC, Type.COLORLESS), NUMERIC("{N/A}", Type.GENERIC, Type.COLORLESS), HYBRID_WU("{W/U}", W, U, Type.HYBRID, Type.COLORED), HYBRID_WB("{W/B}", W, B, Type.HYBRID, Type.COLORED), HYBRID_UB("{U/B}", U, B, Type.HYBRID, Type.COLORED), HYBRID_UR("{U/R}", U, R, Type.HYBRID, Type.COLORED), HYBRID_BR("{B/R}", B, R, Type.HYBRID, Type.COLORED), HYBRID_BG("{B/G}", B, G, Type.HYBRID, Type.COLORED), HYBRID_RG("{R/G}", R, G, Type.HYBRID, Type.COLORED), HYBRID_RW("{R/W}", R, W, Type.HYBRID, Type.COLORED), HYBRID_GW("{G/W}", G, W, Type.HYBRID, Type.COLORED), HYBRID_GU("{G/U}", G, U, Type.HYBRID, Type.COLORED), MONOCOLORED_HYBRID_W("{2/W}", W, Type.HYBRID, Type.MONOCOLORED, Type.COLORED), MONOCOLORED_HYBRID_U("{2/U}", U, Type.HYBRID, Type.MONOCOLORED, Type.COLORED), MONOCOLORED_HYBRID_B("{2/B}", B, Type.HYBRID, Type.MONOCOLORED, Type.COLORED), MONOCOLORED_HYBRID_R("{2/R}", R, Type.HYBRID, Type.MONOCOLORED, Type.COLORED), MONOCOLORED_HYBRID_G("{2/G}", G, Type.HYBRID, Type.MONOCOLORED, Type.COLORED), PHYREXIAN_W("{W/P}", W, Type.PHYREXIAN, Type.COLORED, Type.MONOCOLORED), PHYREXIAN_G("{G/P}", G, Type.PHYREXIAN, Type.COLORED, Type.MONOCOLORED), PHYREXIAN_R("{R/P}", R, Type.PHYREXIAN, Type.COLORED, Type.MONOCOLORED), PHYREXIAN_B("{B/P}", B, Type.PHYREXIAN, Type.COLORED, Type.MONOCOLORED), PHYREXIAN_U("{U/P}", U, Type.PHYREXIAN, Type.COLORED, Type.MONOCOLORED), SNOW("{S}", Type.SNOW); private enum Type { PRIMARY, COLORED, GENERIC, COLORLESS, MONOCOLORED, HYBRID, PHYREXIAN, SNOW } private final String symbol; private final boolean primary; private final boolean colored; private final boolean generic; private final boolean colorless; private final boolean monocolored; private final boolean hybrid; private final boolean phyrexian; private final boolean snow; private final boolean white; private final boolean blue; private final boolean black; private final boolean red; private final boolean green; private final ManaSymbol manaSymbol1; private final ManaSymbol manaSymbol2; /** * @param symbol * @param manaSymbol1 First associated mana symbol. For hybrid mana symbol. * @param manaSymbol2 Second associated mana symbol. For hybrid mana symbol. * @param types */ ManaSymbol(String symbol, ManaSymbol manaSymbol1, ManaSymbol manaSymbol2, Type... types) { this.symbol = symbol; boolean lPrimary = false, lColored = false, lGeneric = false, lColorless = false; boolean lMonocolored = false, lHybrid = false, lPhyrexian = false, lSnow = false; for (Type type : types) { switch (type) { case PRIMARY: lPrimary = true; break; case COLORED: lColored = true; break; case GENERIC: lGeneric = true; break; case COLORLESS: lColorless = true; break; case MONOCOLORED: lMonocolored = true; break; case HYBRID: lHybrid = true; break; case PHYREXIAN: lPhyrexian = true; break; case SNOW: lSnow = true; break; } } primary = lPrimary; colored = lColored; generic = lGeneric; colorless = lColorless; monocolored = lMonocolored; hybrid = lHybrid; phyrexian = lPhyrexian; snow = lSnow; white = symbol.contains("W"); blue = symbol.contains("U"); black = symbol.contains("B"); red = symbol.contains("R"); green = symbol.contains("G"); this.manaSymbol1 = manaSymbol1; this.manaSymbol2 = manaSymbol2; } /** * @param symbol * @param manaSymbol Associated mana symbol. For monocolored hybrid and phyrexian mana. * @param types */ ManaSymbol(String symbol, ManaSymbol manaSymbol, Type... types) { this(symbol, manaSymbol, null, types); } ManaSymbol(String symbol, Type... types) { this(symbol, null, null, types); } public boolean isPrimary() { return primary; } public boolean isColored() { return colored; } public boolean isGeneric() { return generic; } public boolean isColorless() { return colorless; } public boolean isMonocolored() { return monocolored; } public boolean isHybrid() { return hybrid; } public boolean isPhyrexian() { return phyrexian; } public boolean isSnow() { return snow; } public boolean isWhite() { return white; } public boolean isBlue() { return blue; } public boolean isBlack() { return black; } public boolean isRed() { return red; } public boolean isGreen() { return green; } public ManaSymbol getManaSymbol1() { return manaSymbol1; } public ManaSymbol getManaSymbol2() { return manaSymbol2; } @Override public String toString() { return symbol; } }