package forge; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; import java.awt.Image; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import javax.imageio.*; import javax.swing.BorderFactory; import javax.swing.ImageIcon; //import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.border.Border; import forge.properties.ForgeProps; import forge.properties.NewConstants; public class GuiDisplayUtil implements NewConstants { public static JPanel getCardPanel(Card c) { return getCardPanel(c, c.getName()); } public static JPanel getCardPanel(Card c, String name) { JPanel panel = new CardPanel(c); panel.setBorder(getBorder(c)); Image cardImage = ImageCache.getImage(c); if(cardImage != null) { panel.setLayout(new GridLayout(1, 1)); JLabel imageLabel = new JLabel(); if(c.isBasicLand()) { String basicLandSuffix = ""; if(c.getRandomPicture() != 0) { basicLandSuffix = Integer.toString(c.getRandomPicture()); name += basicLandSuffix; } } else if(c.isFaceDown()) name = "Morph"; if(c.isTapped()) { cardImage = ImageUtil.getTappedImage(cardImage, name); } imageLabel.setIcon(new ImageIcon(cardImage)); panel.add(imageLabel); } else { panel.setLayout(new GridLayout(4, 1)); if(c.isFaceDown()) name = "Morph"; panel.add(new JLabel(name + " " + c.getManaCost())); panel.add(new JLabel(formatCardType(c))); JPanel p1 = new JPanel(); panel.add(p1); JLabel tapLabel = new JLabel(); p1.add(tapLabel); if(c.isTapped()) { if(!c.isCreature()) { panel.setLayout(new GridLayout(3, 1)); } p1.setBackground(Color.white); tapLabel.setText("Tapped"); } String stats = c.getNetAttack() + " / " + c.getNetDefense(); if(c.isCreature()) panel.add(new JLabel(stats)); } return panel; }//getCardPanel(Card c, String name) public static Border getBorder(Card card) { Color color; /* if(card.isArtifact()) color = Color.gray; else if(CardUtil.getColor(card).equals(Constant.Color.Black) || card.getName().equals("Swamp") || card.getName().equals("Bog")) color = Color.black; else if(CardUtil.getColor(card).equals(Constant.Color.Green) || card.getName().equals("Forest") || card.getName().equals("Grass")) color = new Color(0, 220, 39); else if(CardUtil.getColor(card).equals(Constant.Color.White) || card.getName().equals("Plains") || card.getName().equals("White Sand")) color = Color.white; else if(CardUtil.getColor(card).equals(Constant.Color.Red) || card.getName().equals("Mountain") || card.getName().equals("Rock")) color = Color.red; else if(CardUtil.getColor(card).equals(Constant.Color.Blue) || card.getName().equals("Island") || card.getName().equals("Underwater")) color = Color.blue; else color = Color.black; if(CardUtil.getColors(card).size() != 1) { color = Color.orange; } */ if(CardUtil.getColors(card).size() > 1) color = Color.orange; else if((CardUtil.getColor(card).equals(Constant.Color.Black) && (!card.getKeyword().contains(card.getName() + " is colorless."))) || (card.getIntrinsicKeyword().contains(card.getName() + " is black."))) color = Color.black; else if((CardUtil.getColor(card).equals(Constant.Color.Green) && (!card.getKeyword().contains(card.getName() + " is colorless."))) || (card.getIntrinsicKeyword().contains(card.getName() + " is green."))) color = new Color(0, 220, 39); else if((CardUtil.getColor(card).equals(Constant.Color.White) && (!card.getKeyword().contains(card.getName() + " is colorless."))) || (card.getIntrinsicKeyword().contains(card.getName() + " is white."))) color = Color.white; else if((CardUtil.getColor(card).equals(Constant.Color.Red) && (!card.getKeyword().contains(card.getName() + " is colorless."))) || (card.getIntrinsicKeyword().contains(card.getName() + " is red."))) color = Color.red; else if((CardUtil.getColor(card).equals(Constant.Color.Blue) && (!card.getKeyword().contains(card.getName() + " is colorless."))) || (card.getIntrinsicKeyword().contains(card.getName() + " is blue."))) color = Color.blue; else if(CardUtil.getColor(card).equals(Constant.Color.Colorless) || (card.getKeyword().contains(card.getName() + " is colorless."))) color = Color.gray; else color = new Color(200, 0, 230); // If your card has a violet border, something is wrong // if(!card.isArtifact()) { if(!CardUtil.getColor(card).equals(Constant.Color.Colorless) || (!card.getKeyword().contains(card.getName() + " is colorless."))) { int r = color.getRed(); int g = color.getGreen(); int b = color.getBlue(); int shade = 10; r -= shade; g -= shade; b -= shade; r = Math.max(0, r); g = Math.max(0, g); b = Math.max(0, b); color = new Color(r, g, b); } //~ return BorderFactory.createLineBorder(color, 2); } public static MouseMotionListener getCardDetailMouse(final GuiDisplay3 visual) { return new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent me) { JPanel panel = (JPanel) me.getSource(); Object o = panel.getComponentAt(me.getPoint()); if((o != null) && (o instanceof CardPanel)) { CardPanel cardPanel = (CardPanel) o; visual.updateCardDetailText(cardPanel.getCard()); visual.updateCardDetailPicture(cardPanel.getCard()); } }//mouseMoved }; } public static MouseMotionListener getCardDetailMouse(final GuiDisplay2 visual) { return new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent me) { JPanel panel = (JPanel) me.getSource(); Object o = panel.getComponentAt(me.getPoint()); if((o != null) && (o instanceof CardPanel)) { CardPanel cardPanel = (CardPanel) o; visual.updateCardDetail(cardPanel.getCard()); } }//mouseMoved }; } public static String formatCardType(Card card) { ArrayList list = card.getType(); String returnString = ""; String s; for(int i = 0; i < list.size(); i++) { s = list.get(i).toString(); if(s.equals("Creature") || s.equals("Land")) { s += " - "; } else s += " "; returnString += s; } return returnString; } public static ImageIcon getImageIcon(Card c) { String suffix = ".jpg"; String filename = ""; if(!c.isFaceDown()) { String basicLandSuffix = ""; if(c.isBasicLand()) { if(c.getRandomPicture() != 0) basicLandSuffix = Integer.toString(c.getRandomPicture()); } filename = cleanString(c.getImageName()) + basicLandSuffix + suffix; } else filename = "morph" + suffix; String loc = ""; if (!c.isToken()) loc = IMAGE_BASE; else loc = IMAGE_TOKEN; File file = new File(ForgeProps.getFile(loc), filename); //try current directory if(!file.exists()) { filename = cleanString(c.getName()) + suffix; file = new File(filename); } if(file.exists()) { if(c.isFaceDown()){ return new ImageIcon(filename); }else{ int cWidth = 0; int cHeight = 0; try { cWidth = GuiDisplayUtil.getPictureHQwidth(c); } catch (IOException e) { e.printStackTrace(); } try { cHeight = GuiDisplayUtil.getPictureHQheight(c); } catch (IOException e) { e.printStackTrace(); } if(cWidth<=312 || cHeight<=445) { return new ImageIcon(filename); }else{ return new ImageIcon(filename); } } } /*else { ImageIcon i = new ImageIcon(); JTextArea text = new JTextArea("\r\n\r\n" + filename, 10, 15); Font f = text.getFont(); f = f.deriveFont(f.getSize() + 2.0f); text.setFont(f); text.setBackground(p.getBackground()); i.add(text); if(c.isToken()) return new ImageIcon(); return i; }//else */ return new ImageIcon(); } public static JPanel getPicture(Card c) { if(AllZone.NameChanger.shouldChangeCardName()) return new JPanel(); String suffix = ".jpg"; String filename = ""; if(!c.isFaceDown()) { String basicLandSuffix = ""; if(c.isBasicLand()) { if(c.getRandomPicture() != 0) { basicLandSuffix = Integer.toString(c.getRandomPicture()); //c.setImageName(c.getImageName() + basicLandSuffix); } } filename = cleanString(c.getImageName())+ basicLandSuffix + suffix; } else filename = "morph" + suffix; String loc = ""; if (!c.isToken()) loc = IMAGE_BASE; else loc = IMAGE_TOKEN; File file = new File(ForgeProps.getFile(loc), filename); //try current directory if(!file.exists()) { filename = cleanString(c.getName()) + suffix; file = new File(filename); } if(file.exists()) { if(c.isFaceDown()){ return new PicturePanel(file); }else{ int cWidth = 0; int cHeight = 0; try { cWidth = GuiDisplayUtil.getPictureHQwidth(c); } catch (IOException e) { e.printStackTrace(); } try { cHeight = GuiDisplayUtil.getPictureHQheight(c); } catch (IOException e) { e.printStackTrace(); } if(cWidth<=312 || cHeight<=445) { return new PicturePanel(file); }else{ return new PicturePanelResize(file); } } } else { JPanel p = new JPanel(); JTextArea text = new JTextArea("\r\n\r\n" + filename, 10, 15); Font f = text.getFont(); f = f.deriveFont(f.getSize() + 2.0f); text.setFont(f); text.setBackground(p.getBackground()); p.add(text); if(c.isToken()) return new JPanel(); return p; }//else }//getPicture() public static JPanel getPictureHQ(Card c) { String loc = ""; if (c.isToken()== false) loc = IMAGE_BASE; else loc = IMAGE_TOKEN; String filename = GuiDisplayUtil.cleanString(c.getImageName()) + ".jpg"; File file = new File(ForgeProps.getFile(loc), filename); return new PicturePanel(file); } public static int getPictureHQheight(Card c) throws IOException{ String loc = ""; if (c.isToken()== false) loc = IMAGE_BASE; else loc = IMAGE_TOKEN; String filename = GuiDisplayUtil.cleanString(c.getImageName()) + ".jpg"; File file = new File(ForgeProps.getFile(loc), filename); BufferedImage a = ImageIO.read(file); return a.getHeight(); } public static int getPictureHQwidth(Card c) throws IOException{ String loc = ""; if (c.isToken()== false) loc = IMAGE_BASE; else loc = IMAGE_TOKEN; String filename = GuiDisplayUtil.cleanString(c.getImageName()) + ".jpg"; File file = new File(ForgeProps.getFile(loc), filename); BufferedImage a = ImageIO.read(file); return a.getWidth(); } public static boolean IsPictureHQExists(Card c) { String loc = ""; if (c.isToken()== false) loc = IMAGE_BASE; else loc = IMAGE_TOKEN; String filename = GuiDisplayUtil.cleanString(c.getImageName()) + ".jpg"; File file = new File(ForgeProps.getFile(loc), filename); if(file.exists()){ return true; } else { return false; } } public static String cleanString(String in) { StringBuffer out = new StringBuffer(); char c; for(int i = 0; i < in.length(); i++) { c = in.charAt(i); if(c == ' ' || c == '-') out.append('_'); else if(Character.isLetterOrDigit(c) || c=='_') { out.append(c); } } return out.toString().toLowerCase(); } public static void setupNoLandPanel(JPanel j, Card c[]) { ArrayList a = new ArrayList(); /* for(int i = 0; i < c.length; i++) if(c[i].isCreature() || c[i].isGlobalEnchantment() || c[i].isArtifact() || c[i].isPlaneswalker()) a.add(c[i]); */ /* //creatures or planeswalkers for(int i = 0; i < c.length; i++) //!artifact because of Memnarch turning planeswalkers into artifacts. if (c[i].isCreature() || (c[i].isPlaneswalker() && !c[i].isArtifact())) a.add(c[i]); //(non-creature, non-enchantment,non-land) artifacts for(int i = 0; i < c.length; i++) if (c[i].isArtifact() && !c[i].isCreature() && !c[i].isLand() && !c[i].isGlobalEnchantment() ) a.add(c[i]); //(non-creature) enchantments for(int i = 0; i < c.length; i++) if (c[i].isGlobalEnchantment() && !c[i].isCreature()) a.add(c[i]); */ for(int i = 0; i < c.length; i++) { a.add(c[i]); } setupNoLandPermPanel(j, a, true); } public static void setupLandPanel(JPanel j, Card c[]) { ArrayList a = new ArrayList(); for(int i = 0; i < c.length; i++) if((!(c[i].isCreature() || c[i].isEnchantment() || c[i].isArtifact() || c[i].isPlaneswalker()) || (c[i].isLand() && c[i].isArtifact() && !c[i].isCreature() && !c[i].isEnchantment())) && !AllZone.GameAction.isAttachee(c[i]) || (c[i].getName().startsWith("Mox") && !c[i].getName().equals("Mox Diamond")) ) a.add(c[i]); setupPanel(j, a, true); } /* private static void setupPanel(JPanel p, ArrayList list) { setupPanel(p, list, false); } */ //list holds Card objects //puts local enchanments in the right order //adds "<<" to local enchanments names private static void setupPanel(JPanel p, ArrayList list, boolean stack) { int maxY = 0; int maxX = 0; //remove all local enchantments Card c; /* for(int i = 0; i < list.size(); i++) { c = (Card)list.get(i); if(c.isLocalEnchantment()) list.remove(i); } //add local enchantments to the permanents //put local enchantments "next to" the permanent they are enchanting //the inner for loop is backward so permanents with more than one local enchantments are in the right order Card ca[]; for(int i = 0; i < list.size(); i++) { c = (Card)list.get(i); if(c.hasAttachedCards()) { ca = c.getAttachedCards(); for(int inner = ca.length - 1; 0 <= inner; inner--) list.add(i + 1, ca[inner]); } } */ if(stack) { // add all Cards in list to the GUI, add arrows to Local Enchantments ArrayList manaPools = getManaPools(list); ArrayList enchantedLands = getEnchantedLands(list); ArrayList basicBlues = getBasics(list, Constant.Color.Blue); ArrayList basicReds = getBasics(list, Constant.Color.Red); ArrayList basicBlacks = getBasics(list, Constant.Color.Black); ArrayList basicGreens = getBasics(list, Constant.Color.Green); ArrayList basicWhites = getBasics(list, Constant.Color.White); ArrayList badlands = getNonBasicLand(list, "Badlands"); ArrayList bayou = getNonBasicLand(list, "Bayou"); ArrayList plateau = getNonBasicLand(list, "Plateau"); ArrayList scrubland = getNonBasicLand(list, "Scrubland"); ArrayList savannah = getNonBasicLand(list, "Savannah"); ArrayList taiga = getNonBasicLand(list, "Taiga"); ArrayList tropicalIsland = getNonBasicLand(list, "Tropical Island"); ArrayList tundra = getNonBasicLand(list, "Tundra"); ArrayList undergroundSea = getNonBasicLand(list, "Underground Sea"); ArrayList volcanicIsland = getNonBasicLand(list, "Volcanic Island"); ArrayList nonBasics = getNonBasics(list); ArrayList moxEmerald = getMoxen(list, "Mox Emerald"); ArrayList moxJet = getMoxen(list, "Mox Jet"); ArrayList moxPearl = getMoxen(list, "Mox Pearl"); ArrayList moxRuby = getMoxen(list, "Mox Ruby"); ArrayList moxSapphire = getMoxen(list, "Mox Sapphire"); //ArrayList moxDiamond = getMoxen(list, "Mox Diamond"); list = new ArrayList(); list.addAll(manaPools); list.addAll(enchantedLands); list.addAll(basicBlues); list.addAll(basicReds); list.addAll(basicBlacks); list.addAll(basicGreens); list.addAll(basicWhites); list.addAll(badlands); list.addAll(bayou); list.addAll(plateau); list.addAll(scrubland); list.addAll(savannah); list.addAll(taiga); list.addAll(tropicalIsland); list.addAll(tundra); list.addAll(undergroundSea); list.addAll(volcanicIsland); list.addAll(nonBasics); list.addAll(moxEmerald); list.addAll(moxJet); list.addAll(moxPearl); list.addAll(moxRuby); list.addAll(moxSapphire); //list.addAll(moxDiamond); int atInStack = 0; int marginX = 5; int marginY = 5; int x = marginX; int cardOffset = 10; String color = ""; ArrayList cards = new ArrayList(); ArrayList connectedCards = new ArrayList(); boolean nextEnchanted = false; Card prevCard = null; int nextXIfNotStacked = 0; for(int i = 0; i < list.size(); i++) { JPanel addPanel; c = list.get(i); addPanel = getCardPanel(c); boolean startANewStack = false; if(!isStackable(c)) { startANewStack = true; } else { String newColor = c.getName(); //CardUtil.getColor(c); if(!newColor.equals(color)) { startANewStack = true; color = newColor; } } if(i == 0) { startANewStack = false; } if(!startANewStack && atInStack == 4) { startANewStack = true; } if(c.isAura() && c.isEnchanting() && !nextEnchanted) startANewStack = false; else if(c.isAura() && c.isEnchanting()) { startANewStack = true; nextEnchanted = false; } if(c.isLand() && c.isEnchanted()) { startANewStack = false; nextEnchanted = true; } //very hacky, but this is to ensure enchantment stacking occurs correctly when a land is enchanted, and there are more lands of that same name else if((prevCard != null && c.isLand() && prevCard.isLand() && prevCard.isEnchanted() && prevCard.getName().equals( c.getName()))) startANewStack = true; else if(prevCard != null && c.isLand() && prevCard.isLand() && !prevCard.getName().equals(c.getName())) startANewStack = true; /* if (c.getName().equals("Squirrel Nest")) { startANewStack = true; System.out.println("startANewStack: " + startANewStack); } */ if(c.isAura() && c.isEnchanting() && prevCard != null && prevCard instanceof ManaPool) startANewStack = true; if(c instanceof ManaPool && prevCard instanceof ManaPool && prevCard.isSnow()) startANewStack = false; if(startANewStack) { setupConnectedCards(connectedCards); connectedCards.clear(); // Fixed distance if last was a stack, looks a bit nicer if(atInStack > 1) { x += Math.max(addPanel.getPreferredSize().width, addPanel.getPreferredSize().height) + marginX; } else { x = nextXIfNotStacked; } atInStack = 0; } else { if(i != 0) { x += cardOffset; } } nextXIfNotStacked = x + marginX + addPanel.getPreferredSize().width; int xLoc = x; int yLoc = marginY; yLoc += atInStack * cardOffset; addPanel.setLocation(new Point(xLoc, yLoc)); addPanel.setSize(addPanel.getPreferredSize()); cards.add(addPanel); connectedCards.add((CardPanel) addPanel); atInStack++; prevCard = c; } setupConnectedCards(connectedCards); connectedCards.clear(); for(int i = cards.size() - 1; i >= 0; i--) { JPanel card = cards.get(i); //maxX = Math.max(maxX, card.getLocation().x + card.getSize().width + marginX); maxY = Math.max(maxY, card.getLocation().y + card.getSize().height + marginY); p.add(card); } maxX = nextXIfNotStacked; //System.out.println("x:" + maxX + ", y:" + maxY); if(maxX > 0 && maxY > 0) { //p.getSize().width || maxY > p.getSize().height) { // p.setSize(new Dimension(maxX, maxY)); p.setPreferredSize(new Dimension(maxX, maxY)); } } else { //add all Cards in list to the GUI, add arrows to Local Enchantments JPanel addPanel; for(int i = 0; i < list.size(); i++) { c = list.get(i); /*if(c.isLocalEnchantment()) addPanel = getCardPanel(c, "<< " +c.getName()); else addPanel = getCardPanel(c); */ addPanel = getCardPanel(c); p.add(addPanel); } } }//setupPanel() @SuppressWarnings("unchecked") private static void setupNoLandPermPanel(JPanel p, ArrayList list, boolean stack) { int maxY = 0; int maxX = 0; Card c; if(stack) { // add all Cards in list to the GUI, add arrows to Local Enchantments ArrayList planeswalkers = getPlaneswalkers(list); ArrayList equippedEnchantedCreatures = getEquippedEnchantedCreatures(list); //this will also fetch the equipment and/or enchantment ArrayList nonTokenCreatures = getNonTokenCreatures(list); ArrayList tokenCreatures = getTokenCreatures(list); //sort tokenCreatures by name (TODO: fix the warning message somehow) Collections.sort(tokenCreatures, new Comparator() { public int compare(Object o1, Object o2) { Card c1 = (Card) o1; Card c2 = (Card) o2; return c1.getName().compareTo(c2.getName()); } }); ArrayList artifacts = getNonCreatureArtifacts(list); ArrayList enchantments = getGlobalEnchantments(list); //ArrayList nonBasics = getNonBasics(list); list = new ArrayList(); list.addAll(planeswalkers); list.addAll(equippedEnchantedCreatures); list.addAll(nonTokenCreatures); list.addAll(tokenCreatures); list.addAll(artifacts); list.addAll(enchantments); int atInStack = 0; int marginX = 5; int marginY = 5; int x = marginX; int cardOffset = 10; String color = ""; ArrayList cards = new ArrayList(); ArrayList connectedCards = new ArrayList(); boolean nextEquippedEnchanted = false; int nextXIfNotStacked = 0; Card prevCard = null; for(int i = 0; i < list.size(); i++) { JPanel addPanel; c = list.get(i); addPanel = getCardPanel(c); boolean startANewStack = false; if(!isStackable(c)) { startANewStack = true; } else { String newColor = c.getName(); //CardUtil.getColor(c); if(!newColor.equals(color)) { startANewStack = true; color = newColor; } } if(i == 0) { startANewStack = false; } if(!startANewStack && atInStack == 4) { startANewStack = true; } if((c.isEquipment() || c.isAura()) && (c.isEquipping() || c.isEnchanting()) && !nextEquippedEnchanted) startANewStack = false; else if((c.isEquipment() || c.isAura()) && (c.isEquipping() || c.isEnchanting())) { startANewStack = true; nextEquippedEnchanted = false; } if(c.isCreature() && (c.isEquipped() || c.isEnchanted())) { startANewStack = false; nextEquippedEnchanted = true; } //very hacky, but this is to ensure equipment stacking occurs correctly when a token is equipped/enchanted, and there are more tokens of that same name else if((prevCard != null && c.isCreature() && prevCard.isCreature() && (prevCard.isEquipped() || prevCard.isEnchanted()) && prevCard.getName().equals( c.getName()))) startANewStack = true; else if(prevCard != null && c.isCreature() && prevCard.isCreature() && !prevCard.getName().equals(c.getName())) startANewStack = true; if( ( (c.isAura() && c.isEnchanting()) || (c.isEquipment() && c.isEquipping()) ) && prevCard != null && prevCard.isPlaneswalker()) startANewStack = true; if(startANewStack) { setupConnectedCards(connectedCards); connectedCards.clear(); // Fixed distance if last was a stack, looks a bit nicer if(atInStack > 1) { x += Math.max(addPanel.getPreferredSize().width, addPanel.getPreferredSize().height) + marginX; } else { x = nextXIfNotStacked; } atInStack = 0; } else { if(i != 0) { x += cardOffset; } } nextXIfNotStacked = x + marginX + addPanel.getPreferredSize().width; int xLoc = x; int yLoc = marginY; yLoc += atInStack * cardOffset; addPanel.setLocation(new Point(xLoc, yLoc)); addPanel.setSize(addPanel.getPreferredSize()); cards.add(addPanel); connectedCards.add((CardPanel) addPanel); atInStack++; prevCard = c; } setupConnectedCards(connectedCards); connectedCards.clear(); for(int i = cards.size() - 1; i >= 0; i--) { JPanel card = cards.get(i); //maxX = Math.max(maxX, card.getLocation().x + card.getSize().width + marginX); maxY = Math.max(maxY, card.getLocation().y + card.getSize().height + marginY); p.add(card); } maxX = nextXIfNotStacked; if(maxX > 0 && maxY > 0) { //p.getSize().width || maxY > p.getSize().height) { p.setPreferredSize(new Dimension(maxX, maxY)); } } else { JPanel addPanel; for(int i = 0; i < list.size(); i++) { c = list.get(i); addPanel = getCardPanel(c); p.add(addPanel); } } }//setupPanel() public static ArrayList getPlaneswalkers(ArrayList cards) { ArrayList ret = new ArrayList(); for(Card c:cards) { if(c.isPlaneswalker() && !c.isArtifact()) ret.add(c); } return ret; } public static ArrayList getEquippedEnchantedCreatures(ArrayList cards) { ArrayList ret = new ArrayList(); for(Card c:cards) { if(c.isCreature() && (c.isEquipped() || c.isEnchanted())) { if(c.isEquipped()) ret.addAll(c.getEquippedBy()); if(c.isEnchanted()) ret.addAll(c.getEnchantedBy()); ret.add(c); } } return ret; } public static ArrayList getNonTokenCreatures(ArrayList cards) { ArrayList ret = new ArrayList(); for(Card c:cards) { if(c.isCreature() && !c.isToken() && !c.isEquipped() && !c.isEnchanted()) ret.add(c); } return ret; } public static ArrayList getTokenCreatures(ArrayList cards) { ArrayList ret = new ArrayList(); for(Card c:cards) { if(c.isCreature() && c.isToken() && !c.isEquipped() && !c.isEnchanted()) ret.add(c); } return ret; } public static ArrayList getTokenCreatures(ArrayList cards, String tokenName) { ArrayList ret = new ArrayList(); for(Card c:cards) { String name = c.getName(); if(c.isCreature() && c.isToken() && name.equals(tokenName)) ret.add(c); } return ret; } public static ArrayList getMoxen(ArrayList cards, String moxName) { ArrayList ret = new ArrayList(); for(Card c:cards) { String name = c.getName(); if(name.equals(moxName) && !c.isCreature()) ret.add(c); } return ret; } public static ArrayList getNonCreatureArtifacts(ArrayList cards) { ArrayList ret = new ArrayList(); for(Card c:cards) { String name = c.getName(); if(c.isArtifact() && !c.isCreature() && !c.isLand() && !c.isGlobalEnchantment() && !(c.isEquipment() && c.isEquipping()) && !name.equals("Mox Emerald") && !name.equals("Mox Jet") && !name.equals("Mox Pearl") && !name.equals("Mox Ruby") && !name.equals("Mox Sapphire")) ret.add(c); } return ret; } public static ArrayList getGlobalEnchantments(ArrayList cards) { ArrayList ret = new ArrayList(); for(Card c:cards) { if(c.isGlobalEnchantment() && !c.isCreature()) ret.add(c); } return ret; } public static ArrayList getCard(ArrayList cards, String name) { ArrayList ret = new ArrayList(); for(Card c:cards) { if(c.getName().equals(name)) ret.add(c); } return ret; } public static ArrayList getEnchantedLands(ArrayList cards) { ArrayList ret = new ArrayList(); for(Card c:cards) { if(c.isLand() && c.isEnchanted()) { ret.addAll(c.getEnchantedBy()); ret.add(c); } } return ret; } public static ArrayList getBasics(ArrayList cards, String color) { ArrayList ret = new ArrayList(); for(Card c:cards) { String name = c.getName(); if(c.isEnchanted()) ;//do nothing else if(name.equals("Swamp") || name.equals("Bog")) { if(color == Constant.Color.Black) { ret.add(c); } } else if(name.equals("Forest") || name.equals("Grass")) { if(color == Constant.Color.Green) { ret.add(c); } } else if(name.equals("Plains") || name.equals("White Sand")) { if(color == Constant.Color.White) { ret.add(c); } } else if(name.equals("Mountain") || name.equals("Rock")) { if(color == Constant.Color.Red) { ret.add(c); } } else if(name.equals("Island") || name.equals("Underwater")) { if(color == Constant.Color.Blue) { ret.add(c); } } } return ret; } public static ArrayList getNonBasics(ArrayList cards) { ArrayList ret = new ArrayList(); for(Card c:cards) { if(!c.isLand() && !c.getName().startsWith("Mox") && !(c instanceof ManaPool)) { ret.add(c); } else { String name = c.getName(); if(c.isEnchanted() || name.equals("Swamp") || name.equals("Bog") || name.equals("Forest") || name.equals("Grass") || name.equals("Plains") || name.equals("White Sand") || name.equals("Mountain") || name.equals("Rock") || name.equals("Island") || name.equals("Underwater") || name.equals("Badlands") || name.equals("Bayou") || name.equals("Plateau") || name.equals("Scrubland") || name.equals("Savannah") || name.equals("Taiga") || name.equals("Tropical Island") || name.equals("Tundra") || name.equals("Underground Sea") || name.equals("Volcanic Island") || name.startsWith("Mox") || c instanceof ManaPool) { // do nothing. } else { ret.add(c); } } } return ret; } public static ArrayList getNonBasicLand(ArrayList cards, String landName) { ArrayList ret = new ArrayList(); for(Card c:cards) if(c.getName().equals(landName)) ret.add(c); return ret; } public static ArrayList getManaPools(ArrayList cards) { ArrayList ret = new ArrayList(); for(Card c:cards) { if(c instanceof ManaPool && !c.isSnow()) { ret.add(((ManaPool)c).smp); ret.add(c); } } return ret; } public static boolean isStackable(Card c) { /*String name = c.getName(); if( name.equals("Swamp") || name.equals("Bog") || name.equals("Forest") || name.equals("Grass") || name.equals("Plains") || name.equals("White Sand") || name.equals("Mountain") || name.equals("Rock") || name.equals("Island") || name.equals("Underwater")) { return true; } */ if(c.isLand() || (c.getName().startsWith("Mox") && !c.getName().equals("Mox Diamond") )|| (c.isLand() && c.isEnchanted()) || (c.isAura() && c.isEnchanting()) || (c.isToken() && CardFactoryUtil.multipleControlled(c)) || (c.isCreature() && (c.isEquipped() || c.isEnchanted())) || (c.isEquipment() && c.isEquipping()) || (c.isEnchantment()) || (c instanceof ManaPool && c.isSnow())) return true; return false; } //~ public static void setupConnectedCards(ArrayList connectedCards) { for(int i = connectedCards.size() - 1; i > 0; i--) { //System.out.println("We should have a stack"); CardPanel cp = connectedCards.get(i); cp.connectedCard = connectedCards.get(i - 1); } } //~ }