/* * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ package mage.abilities.costs.mana; import mage.ManaSymbol; import mage.constants.ColoredManaSymbol; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; /** * Represents the mana symbols on a card. * * @author noxx */ public class ManaSymbols extends ArrayList<ManaSymbol> { private final static Map<ColoredManaSymbol, ManaSymbol> coloredManaMap = new HashMap<ColoredManaSymbol, ManaSymbol>() {{ put(ColoredManaSymbol.W, ManaSymbol.W); put(ColoredManaSymbol.U, ManaSymbol.U); put(ColoredManaSymbol.B, ManaSymbol.B); put(ColoredManaSymbol.R, ManaSymbol.R); put(ColoredManaSymbol.G, ManaSymbol.G); }}; /** * Contains all possible hybrid mana costs (each represents different hybrid mana symbol) * We'll use it for converting from hybrid mana cost to hybrid mana symbol. */ private final static Map<ManaSymbol, HybridManaCost> hybridManaMap = new HashMap<>(); /** * Build map of all possible hybrid mana symbols assigning corresponding instance of hybrid mana cost. */ static { hybridManaMap.put(ManaSymbol.HYBRID_BG, new HybridManaCost(ColoredManaSymbol.B, ColoredManaSymbol.G)); hybridManaMap.put(ManaSymbol.HYBRID_BR, new HybridManaCost(ColoredManaSymbol.B, ColoredManaSymbol.R)); hybridManaMap.put(ManaSymbol.HYBRID_GU, new HybridManaCost(ColoredManaSymbol.G, ColoredManaSymbol.U)); hybridManaMap.put(ManaSymbol.HYBRID_GW, new HybridManaCost(ColoredManaSymbol.G, ColoredManaSymbol.W)); hybridManaMap.put(ManaSymbol.HYBRID_RG, new HybridManaCost(ColoredManaSymbol.R, ColoredManaSymbol.G)); hybridManaMap.put(ManaSymbol.HYBRID_RW, new HybridManaCost(ColoredManaSymbol.R, ColoredManaSymbol.W)); hybridManaMap.put(ManaSymbol.HYBRID_UB, new HybridManaCost(ColoredManaSymbol.U, ColoredManaSymbol.B)); hybridManaMap.put(ManaSymbol.HYBRID_UR, new HybridManaCost(ColoredManaSymbol.U, ColoredManaSymbol.R)); hybridManaMap.put(ManaSymbol.HYBRID_WB, new HybridManaCost(ColoredManaSymbol.W, ColoredManaSymbol.B)); hybridManaMap.put(ManaSymbol.HYBRID_WU, new HybridManaCost(ColoredManaSymbol.W, ColoredManaSymbol.U)); } /** * Extracts mana symbols from {@link ManaCost} using {@link mage.ManaSymbol} as a base class for the mana symbols. * * @param manaCost * @return */ public static ManaSymbols buildFromManaCost(ManaCost manaCost) { ManaSymbols manaSymbols = new ManaSymbols(); if (manaCost instanceof ManaCostsImpl) { ManaCostsImpl manaCosts = (ManaCostsImpl)manaCost; for (int i = 0; i < manaCosts.size(); i++) { ManaCost mc = (ManaCost) manaCosts.get(i); if (mc instanceof ColoredManaCost) { for (Map.Entry<ColoredManaSymbol, ManaSymbol> entry : coloredManaMap.entrySet()) { if (mc.containsColor(entry.getKey())) { manaSymbols.add(entry.getValue()); break; } } } else if (mc instanceof HybridManaCost) { for (Map.Entry<ManaSymbol, HybridManaCost> entry : hybridManaMap.entrySet()) { if (compareHybridCosts((HybridManaCost) mc, entry.getValue())) { manaSymbols.add(entry.getKey()); break; } } } } } return manaSymbols; } /** * Compare two instance of hybrid mana cost. * * @param h1 * @param h2 * * @return */ private static boolean compareHybridCosts(HybridManaCost h1, HybridManaCost h2) { return h1.getMana1() == h2.getMana1() && h1.getMana2() == h2.getMana2() || h1.getMana1() == h2.getMana2() && h1.getMana2() == h2.getMana1(); } }