package magic.cardBuilder.renderers; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import magic.model.MagicAbility; import magic.model.MagicSubType; import magic.model.MagicType; import magic.model.IRenderableCard; public class CardBuilder { public static boolean IS_LOADED; public static BufferedImage getCardBuilderImage(IRenderableCard cardDef) { BufferedImage image; //Frame type hierarchy may need adjusting if (cardDef.isDoubleFaced()) { image = cardDef.isPlaneswalker() ? makeTransformPlaneswalker(cardDef) : makeTransform(cardDef); } else if (cardDef.hasType(MagicType.Planeswalker)) { image = makePlaneswalker(cardDef); } else if (cardDef.isToken()) { image = makeToken(cardDef); } else if (cardDef.isFlipCard()) { image = makeFlipCard(cardDef); } else if (cardDef.isSplitCard()) { image = makeSplitCard(cardDef); } else { image = makeBasicCard(cardDef); } IS_LOADED = true; return image; } private static BufferedImage makeTransform(IRenderableCard cardDef) { BufferedImage cardImage = Frame.getTransformFrameType(cardDef); if (cardDef.isHidden()) { PTFrame.drawHiddenPTPanel(cardImage, cardDef); } else { PTFrame.drawPTPanel(cardImage, cardDef); } TypeLine.drawCardTypeLine(cardImage, cardDef); TypeLine.drawRarity(cardImage, cardDef); TitleFrame.drawTransformCardName(cardImage, cardDef); ImageFrame.drawImage(cardImage, cardDef); TitleFrame.drawManaCost(cardImage, cardDef); PTFrame.drawTransformSymbol(cardImage, cardDef); OracleText.drawOracleText(cardImage, cardDef); return trimImage(cardImage); } private static BufferedImage makeTransformPlaneswalker(IRenderableCard cardDef) { BufferedImage cardImage = Frame.getTransformPlaneswalkerFrameType(cardDef); ImageFrame.drawImage(cardImage, cardDef); OracleText.drawPlaneswalkerOracleText(cardImage, cardDef); PTFrame.drawLoyaltyPanels(cardImage, cardDef); PTFrame.drawTransformSymbol(cardImage, cardDef); TitleFrame.drawTransformCardName(cardImage, cardDef); TitleFrame.drawManaCost(cardImage, cardDef); TypeLine.drawCardTypeLine(cardImage, cardDef); TypeLine.drawRarity(cardImage, cardDef); return trimImage(cardImage); } private static BufferedImage makeFlipCard(IRenderableCard cardDef) { return makeBasicCard(cardDef); } private static BufferedImage makeSplitCard(IRenderableCard cardDef) { BufferedImage firstHalf; BufferedImage secondHalf; if (cardDef.isSecondHalf()) { firstHalf = makeBasicCard(cardDef.getSplitDefinition()); secondHalf = makeBasicCard(cardDef); } else { firstHalf = makeBasicCard(cardDef); secondHalf = makeBasicCard(cardDef.getSplitDefinition()); } BufferedImage base = new BufferedImage(firstHalf.getHeight(), firstHalf.getWidth() << 1, BufferedImage.TYPE_INT_ARGB); Graphics2D graphics2D = base.createGraphics(); //Transforms occur in reverse order AffineTransform affineTransform1 = new AffineTransform(); affineTransform1.translate(0, firstHalf.getWidth() << 1); affineTransform1.rotate(-Math.PI / 2, 0, 0); graphics2D.drawImage(firstHalf, affineTransform1, null); AffineTransform affineTransform2 = new AffineTransform(); affineTransform2.translate(0, secondHalf.getWidth()); affineTransform2.rotate(-Math.PI / 2, 0, 0); graphics2D.drawImage(secondHalf, affineTransform2, null); graphics2D.dispose(); return base; } private static BufferedImage makeToken(IRenderableCard cardDef) { BufferedImage cardImage = Frame.getTokenFrameType(cardDef); ImageFrame.drawImage(cardImage,cardDef); PTFrame.drawPTPanel(cardImage, cardDef); OracleText.drawOracleText(cardImage, cardDef); TitleFrame.drawCardName(cardImage, cardDef); TypeLine.drawCardTypeLine(cardImage, cardDef); TypeLine.drawRarity(cardImage, cardDef); return trimImage(cardImage); } private static BufferedImage makePlaneswalker(IRenderableCard cardDef) { BufferedImage cardImage = Frame.getPlaneswalkerFrameType(cardDef); ImageFrame.drawImage(cardImage, cardDef); OracleText.drawPlaneswalkerOracleText(cardImage, cardDef); PTFrame.drawLoyaltyPanels(cardImage, cardDef); TitleFrame.drawCardName(cardImage, cardDef); TitleFrame.drawManaCost(cardImage, cardDef); TypeLine.drawCardTypeLine(cardImage, cardDef); TypeLine.drawRarity(cardImage, cardDef); return trimImage(cardImage); } private static BufferedImage makeBasicCard(IRenderableCard cardDef) { BufferedImage cardImage = determineBasicFrame(cardDef); Overlay.drawOverlay(cardImage, cardDef); Overlay.drawTextOverlay(cardImage, cardDef); if (cardDef.hasAbility(MagicAbility.LevelUp)) { PTFrame.drawLevellerPTPanels(cardImage, cardDef); PTFrame.drawLevellerArrowText(cardImage, cardDef); OracleText.drawLevellerOracleText(cardImage, cardDef); } else { PTFrame.drawPTPanel(cardImage, cardDef); OracleText.drawOracleText(cardImage, cardDef); } ImageFrame.drawImage(cardImage, cardDef); TitleFrame.drawCardName(cardImage, cardDef); TitleFrame.drawManaCost(cardImage, cardDef); TypeLine.drawCardTypeLine(cardImage, cardDef); TypeLine.drawRarity(cardImage, cardDef); return trimImage(cardImage); } // Remove rounded corners from original image private static BufferedImage trimImage(BufferedImage image) { int cropSize = 5; return image.getSubimage( cropSize, cropSize, image.getWidth() - 2 * cropSize, image.getHeight() - 2 * cropSize ); } private static BufferedImage determineBasicFrame(IRenderableCard cardDef) { if (cardDef.hasAbility(MagicAbility.Devoid)) { return Frame.getColorlessFrameType(cardDef); } else if (cardDef.hasSubType(MagicSubType.Vehicle)) { return Frame.getVehicleFrameType(cardDef); } else { return Frame.getBasicFrameType(cardDef); } } }