diff --git a/forge-core/src/main/java/forge/item/IPaperCard.java b/forge-core/src/main/java/forge/item/IPaperCard.java index 160cb727778..fd4d9f92120 100644 --- a/forge-core/src/main/java/forge/item/IPaperCard.java +++ b/forge-core/src/main/java/forge/item/IPaperCard.java @@ -35,11 +35,6 @@ public interface IPaperCard extends InventoryItem, Serializable { List getAllFaces(); String getCardImageKey(); String getCardAltImageKey(); - String getCardWSpecImageKey(); - String getCardUSpecImageKey(); - String getCardBSpecImageKey(); - String getCardRSpecImageKey(); - String getCardGSpecImageKey(); boolean isRebalanced(); diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index 1e316367b9d..b8bdd79d1fd 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -508,66 +508,6 @@ public String getCardAltImageKey() { return cardAltImageKey; } - private String cardWSpecImageKey = null; - @Override - public String getCardWSpecImageKey() { - if (this.cardWSpecImageKey == null) { - if (this.rules.getSplitType() == CardSplitType.Specialize) - this.cardWSpecImageKey = ImageUtil.getImageKey(this, "white", true); - else // just use cardImageKey - this.cardWSpecImageKey = ImageUtil.getImageKey(this, "", true); - } - return cardWSpecImageKey; - } - - private String cardUSpecImageKey = null; - @Override - public String getCardUSpecImageKey() { - if (this.cardUSpecImageKey == null) { - if (this.rules.getSplitType() == CardSplitType.Specialize) - this.cardUSpecImageKey = ImageUtil.getImageKey(this, "blue", true); - else // just use cardImageKey - this.cardUSpecImageKey = ImageUtil.getImageKey(this, "", true); - } - return cardUSpecImageKey; - } - - private String cardBSpecImageKey = null; - @Override - public String getCardBSpecImageKey() { - if (this.cardBSpecImageKey == null) { - if (this.rules.getSplitType() == CardSplitType.Specialize) - this.cardBSpecImageKey = ImageUtil.getImageKey(this, "black", true); - else // just use cardImageKey - this.cardBSpecImageKey = ImageUtil.getImageKey(this, "", true); - } - return cardBSpecImageKey; - } - - private String cardRSpecImageKey = null; - @Override - public String getCardRSpecImageKey() { - if (this.cardRSpecImageKey == null) { - if (this.rules.getSplitType() == CardSplitType.Specialize) - this.cardRSpecImageKey = ImageUtil.getImageKey(this, "red", true); - else // just use cardImageKey - this.cardRSpecImageKey = ImageUtil.getImageKey(this, "", true); - } - return cardRSpecImageKey; - } - - private String cardGSpecImageKey = null; - @Override - public String getCardGSpecImageKey() { - if (this.cardGSpecImageKey == null) { - if (this.rules.getSplitType() == CardSplitType.Specialize) - this.cardGSpecImageKey = ImageUtil.getImageKey(this, "green", true); - else // just use cardImageKey - this.cardGSpecImageKey = ImageUtil.getImageKey(this, "", true); - } - return cardGSpecImageKey; - } - @Override public boolean hasBackFace(){ CardSplitType cst = this.rules.getSplitType(); diff --git a/forge-core/src/main/java/forge/item/PaperToken.java b/forge-core/src/main/java/forge/item/PaperToken.java index df5f23cf3bc..95fc98f0a2f 100644 --- a/forge-core/src/main/java/forge/item/PaperToken.java +++ b/forge-core/src/main/java/forge/item/PaperToken.java @@ -196,31 +196,6 @@ public String getCardAltImageKey() { return getImageKey(true); } - @Override - public String getCardWSpecImageKey() { - return getImageKey(false); - } - - @Override - public String getCardUSpecImageKey() { - return getImageKey(false); - } - - @Override - public String getCardBSpecImageKey() { - return getImageKey(false); - } - - @Override - public String getCardRSpecImageKey() { - return getImageKey(false); - } - - @Override - public String getCardGSpecImageKey() { - return getImageKey(false); - } - // InventoryItem @Override public String getImageKey(boolean altState) { diff --git a/forge-core/src/main/java/forge/util/ImageUtil.java b/forge-core/src/main/java/forge/util/ImageUtil.java index 38f82a57bc2..c1f99bea0a3 100644 --- a/forge-core/src/main/java/forge/util/ImageUtil.java +++ b/forge-core/src/main/java/forge/util/ImageUtil.java @@ -6,6 +6,7 @@ import forge.card.CardEdition; import forge.card.CardRules; import forge.card.CardSplitType; +import forge.card.MagicColor; import forge.item.IPaperCard; import forge.item.PaperCard; import java.util.regex.Pattern; @@ -97,7 +98,7 @@ public static String transformKey(String imageKey) { return key; } - public static String getImageRelativePath(PaperCard cp, String face, boolean includeSet, boolean isDownloadUrl) { + public static String getImageRelativePath(IPaperCard cp, String face, boolean includeSet, boolean isDownloadUrl) { final String nameToUse = cp == null ? null : getNameToUse(cp, face); if (nameToUse == null) { return null; @@ -153,7 +154,7 @@ public static String getImageRelativePath(PaperCard cp, String face, boolean inc } } - public static String getNameToUse(PaperCard cp, String face) { + public static String getNameToUse(IPaperCard cp, String face) { final CardRules card = cp.getRules(); if (face.equals("back")) { if (cp.hasBackFace()) @@ -197,7 +198,7 @@ public static String getNameToUse(PaperCard cp, String face) { return cp.getName(); } - public static String getImageKey(PaperCard cp, String face, boolean includeSet) { + public static String getImageKey(IPaperCard cp, String face, boolean includeSet) { return getImageRelativePath(cp, face, includeSet, false); } @@ -205,7 +206,6 @@ public static String getDownloadUrl(PaperCard cp, String face) { return getImageRelativePath(cp, face, true, true); } - public static String getScryfallDownloadUrl(PaperCard cp, String face, String setCode, String langCode, boolean useArtCrop){ final Pattern funnyCardCollectorNumberPattern = Pattern.compile("^F\\d+"); String editionCode; @@ -260,6 +260,13 @@ public static String getScryfallDownloadUrl(PaperCard cp, String face, String se faceParam = (face.equals("back") && cp.getRules().getSplitType() != CardSplitType.Flip ? "&face=back" : "&face=front"); + } else if (cp.getRules().getSplitType() == CardSplitType.Specialize) { + // Specialize faces have their own Scryfall entries with collector + // number = base number + color letter (e.g. "2w", "2u", "2b", "2r", "2g") + String colorSuffix = specFaceToCollectorSuffix(face); + if (colorSuffix != null) { + cardCollectorNumber += colorSuffix; + } } if (cardCollectorNumber.endsWith("☇")) { @@ -284,6 +291,12 @@ public static String getScryfallTokenDownloadUrl(String collectorNumber, String langCode, versionParam, faceParam); } + private static String specFaceToCollectorSuffix(String face) { + MagicColor.Color color = MagicColor.Color.fromName(face); + if (color == MagicColor.Color.COLORLESS) return null; + return color.getShortName().toLowerCase(); + } + private static String encodeUtf8(String s) { try { return URLEncoder.encode(s, "UTF-8"); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 57d962b399f..1c8e511628d 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -6355,29 +6355,6 @@ public final void setImageKey(final String iFN) { if(uiCard != null) uiCard.currentState.setImageKey(iFN); } - public final void setImageKey(final IPaperCard ipc, final CardStateName stateName) { - if (ipc == null) - return; - switch (stateName) { - case SpecializeB: - setImageKey(ipc.getCardBSpecImageKey()); - break; - case SpecializeR: - setImageKey(ipc.getCardRSpecImageKey()); - break; - case SpecializeG: - setImageKey(ipc.getCardGSpecImageKey()); - break; - case SpecializeU: - setImageKey(ipc.getCardUSpecImageKey()); - break; - case SpecializeW: - setImageKey(ipc.getCardWSpecImageKey()); - break; - default: - break; - } - } public String getImageKey(CardStateName state) { if (!getRenderForUI()) { @@ -6700,7 +6677,6 @@ public boolean isSpecialized() { } public final void setSpecialized(final boolean bool) { specialized = bool; - setImageKey(getPaperCard(), getCurrentStateName()); } public final boolean canSpecialize() { return getRules() != null && getRules().getSplitType() == CardSplitType.Specialize; diff --git a/forge-gui-desktop/src/main/java/forge/ImageCache.java b/forge-gui-desktop/src/main/java/forge/ImageCache.java index ed296c269af..90c3e070594 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageCache.java +++ b/forge-gui-desktop/src/main/java/forge/ImageCache.java @@ -201,8 +201,7 @@ public static Pair getCardOriginalImageInfo(String image } // return the pair of image and a flag to indicate if it is a placeholder image. - private static Pair getOriginalImageInternal(String imageKey, boolean useDefaultIfNotFound, - CardView cardView) { + private static Pair getOriginalImageInternal(String imageKey, boolean useDefaultIfNotFound, CardView cardView) { if (null == imageKey) { return Pair.of(null, false); } @@ -231,23 +230,7 @@ private static Pair getOriginalImageInternal(String imag if (altState) { imageKey = ipc.getCardAltImageKey(); } else if (!specColor.isEmpty()) { - switch (specColor) { - case "white": - imageKey = ipc.getCardWSpecImageKey(); - break; - case "blue": - imageKey = ipc.getCardUSpecImageKey(); - break; - case "black": - imageKey = ipc.getCardBSpecImageKey(); - break; - case "red": - imageKey = ipc.getCardRSpecImageKey(); - break; - case "green": - imageKey = ipc.getCardGSpecImageKey(); - break; - } + imageKey = ImageUtil.getImageKey(ipc, specColor, true); } else { imageKey = ipc.getCardImageKey(); } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java index 6587f3223ee..8ff4e157913 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java @@ -95,23 +95,7 @@ public static BufferedImage getImageXlhq(final CardStateView state) { if (altState) { imageKey = card.getCardAltImageKey(); } else if (!specColor.isEmpty()) { - switch (specColor) { - case "white": - imageKey = card.getCardWSpecImageKey(); - break; - case "blue": - imageKey = card.getCardUSpecImageKey(); - break; - case "black": - imageKey = card.getCardBSpecImageKey(); - break; - case "red": - imageKey = card.getCardRSpecImageKey(); - break; - case "green": - imageKey = card.getCardGSpecImageKey(); - break; - } + imageKey = ImageUtil.getImageKey(card, specColor, true); } else { imageKey = card.getCardImageKey(); } diff --git a/forge-gui-mobile/src/forge/assets/ImageCache.java b/forge-gui-mobile/src/forge/assets/ImageCache.java index c0177e07a16..704b18b7a25 100644 --- a/forge-gui-mobile/src/forge/assets/ImageCache.java +++ b/forge-gui-mobile/src/forge/assets/ImageCache.java @@ -207,7 +207,26 @@ public boolean imageKeyFileExists(String imageKey) { return paperCard.hasImage(); } else { final boolean backFace = imageKey.endsWith(ImageKeys.BACKFACE_POSTFIX); - final String cardfilename = backFace ? paperCard.getCardAltImageKey() : paperCard.getCardImageKey(); + String specColor = ""; + if (imageKey.endsWith(ImageKeys.SPECFACE_W)) { + specColor = "white"; + } else if (imageKey.endsWith(ImageKeys.SPECFACE_U)) { + specColor = "blue"; + } else if (imageKey.endsWith(ImageKeys.SPECFACE_B)) { + specColor = "black"; + } else if (imageKey.endsWith(ImageKeys.SPECFACE_R)) { + specColor = "red"; + } else if (imageKey.endsWith(ImageKeys.SPECFACE_G)) { + specColor = "green"; + } + String cardfilename; + if (backFace) { + cardfilename = paperCard.getCardAltImageKey(); + } else if (!specColor.isEmpty()) { + cardfilename = ImageUtil.getImageKey(paperCard, specColor, true); + } else { + cardfilename = paperCard.getCardImageKey(); + } return ImageKeys.getCachedCardsFile(cardfilename) != null; } } else if (prefix.equals(ImageKeys.TOKEN_PREFIX)) { @@ -240,13 +259,33 @@ public Texture getImage(String imageKey, boolean useDefaultIfNotFound, boolean o } boolean altState = imageKey.endsWith(ImageKeys.BACKFACE_POSTFIX); - if (altState) { - imageKey = imageKey.substring(0, imageKey.length() - ImageKeys.BACKFACE_POSTFIX.length()); + String specColor = ""; + if (imageKey.endsWith(ImageKeys.SPECFACE_W)) { + specColor = "white"; + } else if (imageKey.endsWith(ImageKeys.SPECFACE_U)) { + specColor = "blue"; + } else if (imageKey.endsWith(ImageKeys.SPECFACE_B)) { + specColor = "black"; + } else if (imageKey.endsWith(ImageKeys.SPECFACE_R)) { + specColor = "red"; + } else if (imageKey.endsWith(ImageKeys.SPECFACE_G)) { + specColor = "green"; } + if (altState) + imageKey = imageKey.substring(0, imageKey.length() - ImageKeys.BACKFACE_POSTFIX.length()); + if (!specColor.isEmpty()) + imageKey = imageKey.substring(0, imageKey.length() - ImageKeys.SPECFACE_W.length()); if (imageKey.startsWith(ImageKeys.CARD_PREFIX)) { PaperCard card = ImageUtil.getPaperCardFromImageKey(imageKey); - if (card != null) - imageKey = altState ? card.getCardAltImageKey() : card.getCardImageKey(); + if (card != null) { + if (altState) { + imageKey = card.getCardAltImageKey(); + } else if (!specColor.isEmpty()) { + imageKey = ImageUtil.getImageKey(card, specColor, true); + } else { + imageKey = card.getCardImageKey(); + } + } } else if (imageKey.startsWith(ImageKeys.TOKEN_PREFIX)) { PaperToken token = ImageUtil.getPaperTokenFromImageKey(imageKey); if (token != null) diff --git a/forge-gui-mobile/src/forge/card/CardZoom.java b/forge-gui-mobile/src/forge/card/CardZoom.java index 47c56282d65..746c7ae986d 100644 --- a/forge-gui-mobile/src/forge/card/CardZoom.java +++ b/forge-gui-mobile/src/forge/card/CardZoom.java @@ -103,27 +103,22 @@ private CardZoom() { if (pc != null) { Card cardW = Card.fromPaperCard(pc, null); cardW.setState(CardStateName.SpecializeW, true); - cardW.setImageKey(pc, CardStateName.SpecializeW); list.add(cardW.getView()); Card cardU = Card.fromPaperCard(pc, null); cardU.setState(CardStateName.SpecializeU, true); - cardU.setImageKey(pc, CardStateName.SpecializeU); list.add(cardU.getView()); Card cardB = Card.fromPaperCard(pc, null); cardB.setState(CardStateName.SpecializeB, true); - cardB.setImageKey(pc, CardStateName.SpecializeB); list.add(cardB.getView()); Card cardR = Card.fromPaperCard(pc, null); cardR.setState(CardStateName.SpecializeR, true); - cardR.setImageKey(pc, CardStateName.SpecializeR); list.add(cardR.getView()); Card cardG = Card.fromPaperCard(pc, null); cardG.setState(CardStateName.SpecializeG, true); - cardG.setImageKey(pc, CardStateName.SpecializeG); list.add(cardG.getView()); } if (!list.isEmpty()) @@ -185,40 +180,37 @@ private static void onCardChanged() { mutateIconBounds = new Rectangle(); } showAltState = false; - if (currentCard != null && currentCard.canSpecialize() && currentCard.getCurrentState().getState() == CardStateName.Original) - specialize.setVisible(true); - else - specialize.setVisible(false); + specialize.setVisible( + currentCard != null && currentCard.canSpecialize() && currentCard.getCurrentState().getState() == CardStateName.Original + ); } private static CardView getCardView(Object item) { if (item instanceof Entry) { item = ((Entry) item).getKey(); } - if (item instanceof CardView) { - return (CardView) item; + if (item instanceof CardView cw) { + return cw; } - if (item instanceof DeckProxy) { - if (item instanceof CardThemedDeckGenerator) { - return CardView.getCardForUi(((CardThemedDeckGenerator) item).getPaperCard()); - } else if (item instanceof CommanderDeckGenerator) { - return CardView.getCardForUi(((CommanderDeckGenerator) item).getPaperCard()); - } else if (item instanceof ArchetypeDeckGenerator) { - return CardView.getCardForUi(((ArchetypeDeckGenerator) item).getPaperCard()); + if (item instanceof DeckProxy deck) { + if (item instanceof CardThemedDeckGenerator gen) { + return CardView.getCardForUi(gen.getPaperCard()); + } else if (item instanceof CommanderDeckGenerator gen) { + return CardView.getCardForUi(gen.getPaperCard()); + } else if (item instanceof ArchetypeDeckGenerator gen) { + return CardView.getCardForUi(gen.getPaperCard()); } else { - DeckProxy deck = ((DeckProxy) item); return new CardView(-1, null, deck.getName(), null, deck.getImageKey(false)); } } - if (item instanceof IPaperCard) { - return CardView.getCardForUi((IPaperCard) item); + if (item instanceof IPaperCard ipc) { + return CardView.getCardForUi(ipc); } - if (item instanceof ConquestCommander) { - return CardView.getCardForUi(((ConquestCommander) item).getCard()); + if (item instanceof ConquestCommander cc) { + return CardView.getCardForUi(cc.getCard()); } - if (item instanceof InventoryItem) { - InventoryItem ii = (InventoryItem)item; + if (item instanceof InventoryItem ii) { return new CardView(-1, null, ii.getDisplayName(), null, ii.getImageKey(false)); } return new CardView(-1, null, item.toString()); @@ -336,7 +328,6 @@ public void drawOverlay(Graphics g) { float cardWidth, cardHeight, y; if (oneCardView && !Forge.isLandscapeMode()) { - cardWidth = w; cardHeight = FCardPanel.ASPECT_RATIO * cardWidth; @@ -349,7 +340,6 @@ public void drawOverlay(Graphics g) { } } } else { - cardWidth = w * 0.5f; cardHeight = FCardPanel.ASPECT_RATIO * cardWidth; diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java index fcc0ff7db4d..4b04af839d2 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -172,29 +172,13 @@ public void fetchImage(final String imageKey, final Callback callback) { } else if (imageKey.endsWith(ImageKeys.SPECFACE_G)) { face = "green"; } - String filename = ""; - switch (face) { - case "back": - filename = paperCard.getCardAltImageKey(); - break; - case "white": - filename = paperCard.getCardWSpecImageKey(); - break; - case "blue": - filename = paperCard.getCardUSpecImageKey(); - break; - case "black": - filename = paperCard.getCardBSpecImageKey(); - break; - case "red": - filename = paperCard.getCardRSpecImageKey(); - break; - case "green": - filename = paperCard.getCardGSpecImageKey(); - break; - default: - filename = paperCard.getCardImageKey(); - break; + String filename; + if (face.equals("back")) { + filename = paperCard.getCardAltImageKey(); + } else if (!face.isEmpty()) { + filename = ImageUtil.getImageKey(paperCard, face, true); + } else { + filename = paperCard.getCardImageKey(); } if (useArtCrop) { filename = TextUtil.fastReplace(filename, ".full", ".artcrop");