diff --git a/forge-core/src/main/java/forge/ImageKeys.java b/forge-core/src/main/java/forge/ImageKeys.java index 681e3ead6ee..7b67f396603 100644 --- a/forge-core/src/main/java/forge/ImageKeys.java +++ b/forge-core/src/main/java/forge/ImageKeys.java @@ -25,6 +25,11 @@ public final class ImageKeys { public static final String FORETELL_IMAGE = "foretell"; public static final String BACKFACE_POSTFIX = "$alt"; + public static final String SPECFACE_W = "$wspec"; + public static final String SPECFACE_U = "$uspec"; + public static final String SPECFACE_B = "$bspec"; + public static final String SPECFACE_R = "$rspec"; + public static final String SPECFACE_G = "$gspec"; private static String CACHE_CARD_PICS_DIR, CACHE_TOKEN_PICS_DIR, CACHE_ICON_PICS_DIR, CACHE_BOOSTER_PICS_DIR, CACHE_FATPACK_PICS_DIR, CACHE_BOOSTERBOX_PICS_DIR, CACHE_PRECON_PICS_DIR, CACHE_TOURNAMENTPACK_PICS_DIR; diff --git a/forge-core/src/main/java/forge/item/IPaperCard.java b/forge-core/src/main/java/forge/item/IPaperCard.java index b71f774fdd6..5edece0287a 100644 --- a/forge-core/src/main/java/forge/item/IPaperCard.java +++ b/forge-core/src/main/java/forge/item/IPaperCard.java @@ -240,5 +240,10 @@ public interface IPaperCard extends InventoryItem, Serializable { boolean hasBackFace(); String getCardImageKey(); String getCardAltImageKey(); + String getCardWSpecImageKey(); + String getCardUSpecImageKey(); + String getCardBSpecImageKey(); + String getCardRSpecImageKey(); + String getCardGSpecImageKey(); } \ No newline at end of file diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index 9fe5b2039f7..2d19f8c2ac0 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -336,6 +336,66 @@ public final class PaperCard implements Comparable, InventoryItemFro 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, false, true, "white"); + else // just use cardImageKey + this.cardWSpecImageKey = ImageUtil.getImageKey(this, false, 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, false, true, "blue"); + else // just use cardImageKey + this.cardUSpecImageKey = ImageUtil.getImageKey(this, false, 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, false, true, "black"); + else // just use cardImageKey + this.cardBSpecImageKey = ImageUtil.getImageKey(this, false, 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, false, true, "red"); + else // just use cardImageKey + this.cardRSpecImageKey = ImageUtil.getImageKey(this, false, 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, false, true, "green"); + else // just use cardImageKey + this.cardGSpecImageKey = ImageUtil.getImageKey(this, false, 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 b240c4644b6..88a8a491b96 100644 --- a/forge-core/src/main/java/forge/item/PaperToken.java +++ b/forge-core/src/main/java/forge/item/PaperToken.java @@ -169,6 +169,27 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { 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 46917508d89..5793f8c6d05 100644 --- a/forge-core/src/main/java/forge/util/ImageUtil.java +++ b/forge-core/src/main/java/forge/util/ImageUtil.java @@ -27,7 +27,12 @@ public class ImageUtil { } public static String getImageRelativePath(PaperCard cp, boolean backFace, boolean includeSet, boolean isDownloadUrl) { - final String nameToUse = cp == null ? null : getNameToUse(cp, backFace); + return getImageRelativePath(cp, backFace, includeSet, isDownloadUrl, ""); + } + + public static String getImageRelativePath(PaperCard cp, boolean backFace, boolean includeSet, boolean isDownloadUrl, + String specializeColor) { + final String nameToUse = cp == null ? null : getNameToUse(cp, backFace, specializeColor); if (nameToUse == null) { return null; } @@ -80,8 +85,37 @@ public class ImageUtil { } } - public static String getNameToUse(PaperCard cp, boolean backFace) { + public static String getNameToUse(PaperCard cp, boolean backFace, String specialize) { final CardRules card = cp.getRules(); + if (!specialize.equals("")) { + switch (specialize) { + case "white": + if (card.getWSpecialize() != null) { + return card.getWSpecialize().getName(); + } + break; + case "blue": + if (card.getUSpecialize() != null) { + return card.getUSpecialize().getName(); + } + break; + case "black": + if (card.getBSpecialize() != null) { + return card.getBSpecialize().getName(); + } + break; + case "red": + if (card.getRSpecialize() != null) { + return card.getRSpecialize().getName(); + } + break; + case "green": + if (card.getGSpecialize() != null) { + return card.getGSpecialize().getName(); + } + break; + } + } if (backFace) { if (cp.hasBackFace()) if (card.getOtherPart() != null) { @@ -94,7 +128,7 @@ public class ImageUtil { } else return null; - } else if(CardSplitType.Split == cp.getRules().getSplitType()) { + } else if (CardSplitType.Split == cp.getRules().getSplitType()) { return card.getMainPart().getName() + card.getOtherPart().getName(); } else { return cp.getName(); @@ -102,7 +136,11 @@ public class ImageUtil { } public static String getImageKey(PaperCard cp, boolean backFace, boolean includeSet) { - return getImageRelativePath(cp, backFace, includeSet, false); + return getImageKey(cp, backFace, includeSet, ""); + } + + public static String getImageKey(PaperCard cp, boolean backFace, boolean includeSet, String specializeColor) { + return getImageRelativePath(cp, backFace, includeSet, false, specializeColor); } public static String getDownloadUrl(PaperCard cp, boolean backFace) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 29a8259d448..175f7a8c288 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -280,6 +280,27 @@ public class CardFactory { } else if (c.isAdventureCard()) { c.setState(CardStateName.Adventure, false); c.setImageKey(originalPicture); + } else if (c.canSpecialize()) { + c.setState(CardStateName.SpecializeW, false); + c.setImageKey(cp.getImageKey(false) + ImageKeys.SPECFACE_W); + c.setSetCode(cp.getEdition()); + c.setRarity(cp.getRarity()); + c.setState(CardStateName.SpecializeU, false); + c.setImageKey(cp.getImageKey(false) + ImageKeys.SPECFACE_U); + c.setSetCode(cp.getEdition()); + c.setRarity(cp.getRarity()); + c.setState(CardStateName.SpecializeB, false); + c.setImageKey(cp.getImageKey(false) + ImageKeys.SPECFACE_B); + c.setSetCode(cp.getEdition()); + c.setRarity(cp.getRarity()); + c.setState(CardStateName.SpecializeR, false); + c.setImageKey(cp.getImageKey(false) + ImageKeys.SPECFACE_R); + c.setSetCode(cp.getEdition()); + c.setRarity(cp.getRarity()); + c.setState(CardStateName.SpecializeG, false); + c.setImageKey(cp.getImageKey(false) + ImageKeys.SPECFACE_G); + c.setSetCode(cp.getEdition()); + c.setRarity(cp.getRarity()); } c.setSetCode(cp.getEdition()); diff --git a/forge-gui-desktop/src/main/java/forge/ImageCache.java b/forge-gui-desktop/src/main/java/forge/ImageCache.java index cc1d6e10574..c9e83c0fc28 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageCache.java +++ b/forge-gui-desktop/src/main/java/forge/ImageCache.java @@ -172,12 +172,48 @@ public class ImageCache { IPaperCard ipc = null; boolean altState = imageKey.endsWith(ImageKeys.BACKFACE_POSTFIX); + 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.equals("")) + imageKey = imageKey.substring(0, imageKey.length() - ImageKeys.SPECFACE_W.length()); if (imageKey.startsWith(ImageKeys.CARD_PREFIX)) { ipc = ImageUtil.getPaperCardFromImageKey(imageKey); if (ipc != null) { - imageKey = altState ? ipc.getCardAltImageKey() : ipc.getCardImageKey(); + if (altState) { + imageKey = ipc.getCardAltImageKey(); + } else if (!specColor.equals("")) { + 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; + } + } else { + imageKey = ipc.getCardImageKey(); + } if (StringUtils.isBlank(imageKey)) return Pair.of(_defaultImage, true); } 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 8f6fe9c231c..946c9db7273 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 @@ -77,15 +77,51 @@ public final class FImageUtil { } boolean altState = key.endsWith(ImageKeys.BACKFACE_POSTFIX); + String specColor = ""; + if (key.endsWith(ImageKeys.SPECFACE_W)) { + specColor = "white"; + } else if (key.endsWith(ImageKeys.SPECFACE_U)) { + specColor = "blue"; + } else if (key.endsWith(ImageKeys.SPECFACE_B)) { + specColor = "black"; + } else if (key.endsWith(ImageKeys.SPECFACE_R)) { + specColor = "red"; + } else if (key.endsWith(ImageKeys.SPECFACE_G)) { + specColor = "green"; + } String imageKey = key; if (prefix.equals(ImageKeys.CARD_PREFIX)) { PaperCard card = ImageUtil.getPaperCardFromImageKey(key); - if (card != null) - imageKey = altState ? card.getCardAltImageKey() : card.getCardImageKey(); + if (altState) { + imageKey = card.getCardAltImageKey(); + } else if (!specColor.equals("")) { + 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; + } + } else { + imageKey = card.getCardImageKey(); + } } if(altState) { imageKey = imageKey.substring(0, imageKey.length() - ImageKeys.BACKFACE_POSTFIX.length()); imageKey += "full.jpg"; + } else if (!specColor.equals("")) { + imageKey = imageKey.substring(0, imageKey.length() - ImageKeys.SPECFACE_W.length()); + imageKey += "full.jpg"; } File file = ImageKeys.getImageFile(imageKey); diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java index e27e04557a4..b8c6c1ad990 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -108,7 +108,42 @@ public abstract class ImageFetcher { String imagePath = ImageUtil.getImageRelativePath(paperCard, false, true, false); final boolean hasSetLookup = ImageKeys.hasSetLookup(imagePath); final boolean backFace = imageKey.endsWith(ImageKeys.BACKFACE_POSTFIX); - String filename = 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 filename = ""; + if (backFace) { + filename = paperCard.getCardAltImageKey(); + } else if (!specColor.equals("")) { + switch (specColor) { + 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; + } + } else { + filename = paperCard.getCardImageKey(); + } if (useArtCrop) { filename = TextUtil.fastReplace(filename, ".full", ".artcrop"); }