diff --git a/.gitattributes b/.gitattributes index aef55c3c030..62cf8ad019a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -122,6 +122,7 @@ forge-game/pom.xml -text forge-game/src/main/java/forge/Command.java svneol=native#text/plain forge-game/src/main/java/forge/Constant.java svneol=native#text/plain forge-game/src/main/java/forge/Dependencies.java -text +forge-game/src/main/java/forge/ImageKeys.java -text forge-game/src/main/java/forge/ai/AiAttackController.java svneol=native#text/plain forge-game/src/main/java/forge/ai/AiBlockController.java svneol=native#text/plain forge-game/src/main/java/forge/ai/AiController.java svneol=native#text/plain @@ -15205,7 +15206,6 @@ forge-gui/src/main/html/js/observable.js -text forge-gui/src/main/html/js/socket.js -text forge-gui/src/main/java/forge/FThreads.java -text forge-gui/src/main/java/forge/ImageCache.java svneol=native#text/plain -forge-gui/src/main/java/forge/ImageCacheProvider.java -text forge-gui/src/main/java/forge/ImageLoader.java -text forge-gui/src/main/java/forge/PreferencesProvider.java -text forge-gui/src/main/java/forge/Singletons.java svneol=native#text/plain diff --git a/forge-game/src/main/java/forge/Dependencies.java b/forge-game/src/main/java/forge/Dependencies.java index 85225c2b241..f4d4fb72677 100644 --- a/forge-game/src/main/java/forge/Dependencies.java +++ b/forge-game/src/main/java/forge/Dependencies.java @@ -1,24 +1,15 @@ package forge; -import forge.item.InventoryItem; - public class Dependencies { public static PreferencesMethods preferences; public interface PreferencesMethods { - public abstract boolean getEnableAiCheats(); - public abstract boolean getCloneModeSource(); - public abstract String getLogEntryType(); - public abstract String getCurrentAiProfile(); - public abstract boolean canRandomFoil(); - public abstract boolean isManaBurnEnabled(); - public abstract boolean areBlocksFree(); - } - - public static ImageCacheMethods imagecache; - public interface ImageCacheMethods { - String getImageKey(InventoryItem cp, boolean altState); - String getTokenKey(String imageName); - String getMorphImage(); + @Deprecated public abstract boolean getEnableAiCheats(); + @Deprecated public abstract boolean getCloneModeSource(); + @Deprecated public abstract String getLogEntryType(); + @Deprecated public abstract String getCurrentAiProfile(); + @Deprecated public abstract boolean canRandomFoil(); + @Deprecated public abstract boolean isManaBurnEnabled(); + @Deprecated public abstract boolean areBlocksFree(); } } \ No newline at end of file diff --git a/forge-game/src/main/java/forge/ImageKeys.java b/forge-game/src/main/java/forge/ImageKeys.java new file mode 100644 index 00000000000..0d197b1e1fc --- /dev/null +++ b/forge-game/src/main/java/forge/ImageKeys.java @@ -0,0 +1,51 @@ +package forge; + +import forge.item.BoosterPack; +import forge.item.FatPack; +import forge.item.InventoryItem; +import forge.item.PaperCard; +import forge.item.PaperToken; +import forge.item.PreconDeck; +import forge.item.TournamentPack; + +public class ImageKeys { + public static final String CARD_PREFIX = "c:"; + public static final String TOKEN_PREFIX = "t:"; + public static final String ICON_PREFIX = "i:"; + public static final String BOOSTER_PREFIX = "b:"; + public static final String FATPACK_PREFIX = "f:"; + public static final String PRECON_PREFIX = "p:"; + public static final String TOURNAMENTPACK_PREFIX = "o:"; + + public static final String MORPH_IMAGE = "morph"; + + public static final String BACKFACE_POSTFIX = "$alt"; + + // Inventory items don't have to know how a certain client should draw them. + // That's why this method is not encapsulated and overloaded in the InventoryItem descendants + public static String getImageKey(InventoryItem ii, boolean altState) { + if ( ii instanceof PaperCard ) { + PaperCard cp = (PaperCard)ii; + return ImageKeys.CARD_PREFIX + cp.getName() + "|" + cp.getEdition() + "|" + cp.getArtIndex() + (altState ? BACKFACE_POSTFIX : ""); + } + if ( ii instanceof TournamentPack ) + return ImageKeys.TOURNAMENTPACK_PREFIX + ((TournamentPack)ii).getEdition(); + if ( ii instanceof BoosterPack ) { + BoosterPack bp = (BoosterPack)ii; + int cntPics = StaticData.instance().getEditions().get(bp.getEdition()).getCntBoosterPictures(); + String suffix = (1 >= cntPics) ? "" : ("_" + bp.getArtIndex()); + return ImageKeys.BOOSTER_PREFIX + bp.getEdition() + suffix; + } + if ( ii instanceof FatPack ) + return ImageKeys.FATPACK_PREFIX + ((FatPack)ii).getEdition(); + if ( ii instanceof PreconDeck ) + return ImageKeys.PRECON_PREFIX + ((PreconDeck)ii).getImageFilename(); + if ( ii instanceof PaperToken ) + return ImageKeys.TOKEN_PREFIX + ((PaperToken)ii).getImageFilename(); + return null; + } + + public static String getTokenKey(String tokenName) { + return ImageKeys.TOKEN_PREFIX + tokenName; + } +} diff --git a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java index c01fac76f5e..9529e6c07bf 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java @@ -3,7 +3,7 @@ package forge.game.ability.effects; import java.util.List; import forge.Command; -import forge.Dependencies; +import forge.ImageKeys; import forge.game.Game; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityUtils; @@ -104,7 +104,7 @@ public class EffectEffect extends SpellAbilityEffect { eff.addType("Effect"); // Or Emblem eff.setToken(true); // Set token to true, so when leaving play it gets nuked eff.setOwner(controller); - eff.setImageKey(sa.hasParam("Image") ? Dependencies.imagecache.getTokenKey(sa.getParam("Image")) : hostCard.getImageKey()); + eff.setImageKey(sa.hasParam("Image") ? ImageKeys.getTokenKey(sa.getParam("Image")) : hostCard.getImageKey()); eff.setColor(hostCard.getColor()); eff.setImmutable(true); eff.setEffectSource(hostCard); 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 79d16266149..a9d93c6a645 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -22,7 +22,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map.Entry; -import forge.Dependencies; +import forge.ImageKeys; import forge.card.CardCharacteristicName; import forge.card.CardRules; import forge.card.CardSplitType; @@ -266,7 +266,7 @@ public class CardFactory { c.setRarity(cp.getRarity()); // Would like to move this away from in-game entities - String originalPicture = Dependencies.imagecache.getImageKey(cp, false); + String originalPicture = ImageKeys.getImageKey(cp, false); //System.out.println(c.getName() + " -> " + originalPicture); c.setImageKey(originalPicture); c.setToken(cp.isToken()); @@ -274,11 +274,11 @@ public class CardFactory { if (c.hasAlternateState()) { if (c.isFlipCard()) { c.setState(CardCharacteristicName.Flipped); - c.setImageKey(Dependencies.imagecache.getImageKey(cp, true)); + c.setImageKey(ImageKeys.getImageKey(cp, true)); } else if (c.isDoubleFaced() && cp instanceof PaperCard) { c.setState(CardCharacteristicName.Transformed); - c.setImageKey(Dependencies.imagecache.getImageKey(cp, true)); + c.setImageKey(ImageKeys.getImageKey(cp, true)); } else if (c.isSplitCard()) { c.setState(CardCharacteristicName.LeftSplit); @@ -576,7 +576,7 @@ public class CardFactory { final List list = new ArrayList(); final Card c = new Card(controller.getGame().nextCardId()); c.setName(name); - c.setImageKey(Dependencies.imagecache.getTokenKey(imageName)); + c.setImageKey(ImageKeys.getTokenKey(imageName)); // TODO - most tokens mana cost is 0, this needs to be fixed // c.setManaCost(manaCost); diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index e270c38883d..518ba0cc09c 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -23,7 +23,7 @@ import java.util.List; import java.util.Set; import forge.Constant; -import forge.Dependencies; +import forge.ImageKeys; import forge.card.CardCharacteristicName; import forge.card.ColorSet; import forge.card.MagicColor; @@ -217,7 +217,7 @@ public final class CardUtil { ret.setName(""); ret.setType(types); - ret.setImageKey(Dependencies.imagecache.getMorphImage()); + ret.setImageKey(ImageKeys.getTokenKey(ImageKeys.MORPH_IMAGE)); return ret; } diff --git a/forge-gui/src/main/java/forge/ImageCache.java b/forge-gui/src/main/java/forge/ImageCache.java index 039c83af079..efe32aff38e 100644 --- a/forge-gui/src/main/java/forge/ImageCache.java +++ b/forge-gui/src/main/java/forge/ImageCache.java @@ -32,22 +32,19 @@ import com.google.common.cache.CacheLoader.InvalidCacheLoadException; import com.google.common.cache.LoadingCache; import com.mortennobel.imagescaling.ResampleOp; +import forge.card.CardDb; import forge.card.CardRules; import forge.card.CardSplitType; import forge.game.card.Card; import forge.game.player.IHasIcon; import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin.SkinIcon; -import forge.item.BoosterPack; import forge.item.PaperCard; -import forge.item.PaperToken; -import forge.item.FatPack; import forge.item.InventoryItem; -import forge.item.PreconDeck; -import forge.item.TournamentPack; import forge.properties.ForgePreferences.FPref; import forge.properties.NewConstants; import forge.util.Base64Coder; +import forge.util.TextUtil; /** * This class stores ALL card images in a cache with soft values. this means @@ -65,13 +62,7 @@ import forge.util.Base64Coder; */ public class ImageCache { // short prefixes to save memory - public static final String TOKEN_PREFIX = "t:"; - public static final String ICON_PREFIX = "i:"; - public static final String BOOSTER_PREFIX = "b:"; - public static final String FATPACK_PREFIX = "f:"; - public static final String PRECON_PREFIX = "p:"; - public static final String TOURNAMENTPACK_PREFIX = "o:"; - + private static final Set _missingIconKeys = new HashSet(); private static final LoadingCache _CACHE = CacheBuilder.newBuilder().softValues().build(new ImageLoader()); private static final BufferedImage _defaultImage; @@ -105,7 +96,7 @@ public class ImageCache { public static BufferedImage getImage(Card card, int width, int height) { final String key; if (!Singletons.getControl().mayShowCard(card) || card.isFaceDown()) { - key = TOKEN_PREFIX + NewConstants.CACHE_MORPH_IMAGE_FILE; + key = ImageKeys.TOKEN_PREFIX + ImageKeys.MORPH_IMAGE; } else { key = card.getImageKey(); } @@ -117,7 +108,7 @@ public class ImageCache { * and cannot be loaded from disk. pass -1 for width and/or height to avoid resizing in that dimension. */ public static BufferedImage getImage(InventoryItem ii, int width, int height) { - return scaleImage(getImageKey(ii, false), width, height, true); + return scaleImage(ImageKeys.getImageKey(ii, false), width, height, true); } /** @@ -145,6 +136,13 @@ public class ImageCache { */ public static BufferedImage getOriginalImage(String imageKey, boolean useDefaultIfNotFound) { + boolean altState = imageKey.endsWith(ImageKeys.BACKFACE_POSTFIX); + if(altState) + imageKey = imageKey.substring(0, imageKey.length() - ImageKeys.BACKFACE_POSTFIX.length()); + if (imageKey.startsWith(ImageKeys.CARD_PREFIX)) + imageKey = getImageKey(getPaperCardFromImageKey(imageKey.substring(2)), altState, true); + + // Load from file and add to cache if not found in cache initially. BufferedImage original = getImage(imageKey); @@ -161,6 +159,34 @@ public class ImageCache { return original; } + + private static PaperCard getPaperCardFromImageKey(String key) { + if( key == null ) + return null; + + PaperCard cp = StaticData.instance().getCommonCards().tryGetCard(key); + if ( cp == null ) + cp = StaticData.instance().getVariantCards().tryGetCard(key); + if( cp != null ) + return cp; + + // try to remove art index + if( key.charAt(key.length() - 2) == '|') { + key = key.substring(0, key.length() - 2); + cp = StaticData.instance().getCommonCards().tryGetCard(key); + if ( cp == null ) + cp = StaticData.instance().getVariantCards().tryGetCard(key); + if( cp != null ) + return cp; + } + + // try only name + key = TextUtil.split(key, '|')[0]; + cp = StaticData.instance().getCommonCards().tryGetCard(key); + if ( cp == null ) + cp = StaticData.instance().getVariantCards().tryGetCard(key); + return cp; + } private static BufferedImage scaleImage(String key, final int width, final int height, boolean useDefaultImage) { if (StringUtils.isEmpty(key) || (3 > width && -1 != width) || (3 > height && -1 != height)) { @@ -228,35 +254,11 @@ public class ImageCache { } } - // Inventory items don't have to know how a certain client should draw them. - // That's why this method is not encapsulated and overloaded in the InventoryItem descendants - public static String getImageKey(InventoryItem ii, boolean altState) { - if ( ii instanceof PaperCard ) - return getImageKey((PaperCard)ii, altState, true); - if ( ii instanceof TournamentPack ) - return ImageCache.TOURNAMENTPACK_PREFIX + ((TournamentPack)ii).getEdition(); - if ( ii instanceof BoosterPack ) { - BoosterPack bp = (BoosterPack)ii; - int cntPics = Singletons.getMagicDb().getEditions().get(bp.getEdition()).getCntBoosterPictures(); - String suffix = (1 >= cntPics) ? "" : ("_" + bp.getArtIndex()); - return ImageCache.BOOSTER_PREFIX + bp.getEdition() + suffix; - } - if ( ii instanceof FatPack ) - return ImageCache.FATPACK_PREFIX + ((FatPack)ii).getEdition(); - if ( ii instanceof PreconDeck ) - return ImageCache.PRECON_PREFIX + ((PreconDeck)ii).getImageFilename(); - if ( ii instanceof PaperToken ) - return ImageCache.TOKEN_PREFIX + ((PaperToken)ii).getImageFilename(); - return null; - } - public static String getTokenImageKey(String tokenName) { - return TOKEN_PREFIX + tokenName; - } - private static String getImageLocator(PaperCard cp, boolean backFace, boolean includeSet, boolean isDownloadUrl) { + private static String getImageRelativePath(PaperCard cp, boolean backFace, boolean includeSet, boolean isDownloadUrl) { final String nameToUse = getNameToUse(cp, backFace); if ( null == nameToUse ) return null; @@ -269,8 +271,9 @@ public class ImageCache { final int cntPictures; final boolean hasManyPictures; + final CardDb db = !card.isVariant() ? Singletons.getMagicDb().getCommonCards() : Singletons.getMagicDb().getVariantCards(); if (includeSet) { - cntPictures = !card.isVariant() ? Singletons.getMagicDb().getCommonCards().getPrintCount(card.getName(), edition) : Singletons.getMagicDb().getVariantCards().getPrintCount(card.getName(), edition); + cntPictures = db.getPrintCount(card.getName(), edition); hasManyPictures = cntPictures > 1; } else { // without set number of pictures equals number of urls provided in Svar:Picture @@ -278,7 +281,7 @@ public class ImageCache { cntPictures = StringUtils.countMatches(urls, "\\") + 1; // raise the art index limit to the maximum of the sets this card was printed in - int maxCntPictures = !card.isVariant() ? Singletons.getMagicDb().getCommonCards().getMaxPrintCount(card.getName()) : Singletons.getMagicDb().getVariantCards().getMaxPrintCount(card.getName()); + int maxCntPictures = db.getMaxPrintCount(card.getName()); hasManyPictures = maxCntPictures > 1; } @@ -336,11 +339,11 @@ public class ImageCache { } public static String getImageKey(PaperCard cp, boolean backFace, boolean includeSet) { - return getImageLocator(cp, backFace, includeSet, false); + return getImageRelativePath(cp, backFace, includeSet, false); } public static String getDownloadUrl(PaperCard cp, boolean backFace) { - return getImageLocator(cp, backFace, true, true); + return getImageRelativePath(cp, backFace, true, true); } public static String toMWSFilename(String in) { diff --git a/forge-gui/src/main/java/forge/ImageCacheProvider.java b/forge-gui/src/main/java/forge/ImageCacheProvider.java deleted file mode 100644 index 938e090b7d6..00000000000 --- a/forge-gui/src/main/java/forge/ImageCacheProvider.java +++ /dev/null @@ -1,23 +0,0 @@ -package forge; - -import forge.Dependencies.ImageCacheMethods; -import forge.item.InventoryItem; -import forge.properties.NewConstants; - -public class ImageCacheProvider implements ImageCacheMethods { - - @Override - public String getImageKey(InventoryItem cp, boolean altState) { - return ImageCache.getImageKey(cp, altState); - } - - @Override - public String getTokenKey(String imageName) { - return ImageCache.getTokenImageKey(imageName); - } - - @Override - public String getMorphImage() { - return NewConstants.CACHE_MORPH_IMAGE_FILE; - } -} \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/ImageLoader.java b/forge-gui/src/main/java/forge/ImageLoader.java index 84fc48bd588..feb489b072a 100644 --- a/forge-gui/src/main/java/forge/ImageLoader.java +++ b/forge-gui/src/main/java/forge/ImageLoader.java @@ -26,23 +26,23 @@ final class ImageLoader extends CacheLoader { final String path; final String filename; - if (key.startsWith(ImageCache.TOKEN_PREFIX)) { - filename = key.substring(ImageCache.TOKEN_PREFIX.length()); + if (key.startsWith(ImageKeys.TOKEN_PREFIX)) { + filename = key.substring(ImageKeys.TOKEN_PREFIX.length()); path = NewConstants.CACHE_TOKEN_PICS_DIR; - } else if (key.startsWith(ImageCache.ICON_PREFIX)) { - filename = key.substring(ImageCache.ICON_PREFIX.length()); + } else if (key.startsWith(ImageKeys.ICON_PREFIX)) { + filename = key.substring(ImageKeys.ICON_PREFIX.length()); path = NewConstants.CACHE_ICON_PICS_DIR; - } else if (key.startsWith(ImageCache.BOOSTER_PREFIX)) { - filename = key.substring(ImageCache.BOOSTER_PREFIX.length()); + } else if (key.startsWith(ImageKeys.BOOSTER_PREFIX)) { + filename = key.substring(ImageKeys.BOOSTER_PREFIX.length()); path = NewConstants.CACHE_BOOSTER_PICS_DIR; - } else if (key.startsWith(ImageCache.FATPACK_PREFIX)) { - filename = key.substring(ImageCache.FATPACK_PREFIX.length()); + } else if (key.startsWith(ImageKeys.FATPACK_PREFIX)) { + filename = key.substring(ImageKeys.FATPACK_PREFIX.length()); path = NewConstants.CACHE_FATPACK_PICS_DIR; - } else if (key.startsWith(ImageCache.PRECON_PREFIX)) { - filename = key.substring(ImageCache.PRECON_PREFIX.length()); + } else if (key.startsWith(ImageKeys.PRECON_PREFIX)) { + filename = key.substring(ImageKeys.PRECON_PREFIX.length()); path = NewConstants.CACHE_PRECON_PICS_DIR; - } else if (key.startsWith(ImageCache.TOURNAMENTPACK_PREFIX)) { - filename = key.substring(ImageCache.TOURNAMENTPACK_PREFIX.length()); + } else if (key.startsWith(ImageKeys.TOURNAMENTPACK_PREFIX)) { + filename = key.substring(ImageKeys.TOURNAMENTPACK_PREFIX.length()); path = NewConstants.CACHE_TOURNAMENTPACK_PICS_DIR; } else { filename = key; diff --git a/forge-gui/src/main/java/forge/gui/CardPicturePanel.java b/forge-gui/src/main/java/forge/gui/CardPicturePanel.java index d681f919d59..b76397af61d 100644 --- a/forge-gui/src/main/java/forge/gui/CardPicturePanel.java +++ b/forge-gui/src/main/java/forge/gui/CardPicturePanel.java @@ -24,6 +24,7 @@ import java.awt.image.BufferedImage; import javax.swing.JPanel; import forge.ImageCache; +import forge.ImageKeys; import forge.Singletons; import forge.card.CardCharacteristicName; import forge.game.card.Card; @@ -88,7 +89,7 @@ public final class CardPicturePanel extends JPanel { if (displayed instanceof InventoryItem) { InventoryItem item = (InventoryItem) displayed; - image = ImageCache.getOriginalImage(ImageCache.getImageKey(item, false), true); + image = ImageCache.getOriginalImage(ImageKeys.getImageKey(item, false), true); } else if (displayed instanceof Card) { image = FImageUtil.getImage((Card)displayed); diff --git a/forge-gui/src/main/java/forge/properties/NewConstants.java b/forge-gui/src/main/java/forge/properties/NewConstants.java index 2752d87b177..a7cb90e46e1 100644 --- a/forge-gui/src/main/java/forge/properties/NewConstants.java +++ b/forge-gui/src/main/java/forge/properties/NewConstants.java @@ -103,7 +103,6 @@ public final class NewConstants { public static final String CACHE_PRECON_PICS_DIR = _PICS_DIR + "precons/"; public static final String CACHE_TOURNAMENTPACK_PICS_DIR = _PICS_DIR + "tournamentpacks/"; public static final String QUEST_CARD_PRICE_FILE = DB_DIR + "all-prices.txt"; - public static final String CACHE_MORPH_IMAGE_FILE = "morph"; public static final String[] PROFILE_DIRS = { USER_DIR, diff --git a/forge-gui/src/main/java/forge/quest/io/QuestChallengeReader.java b/forge-gui/src/main/java/forge/quest/io/QuestChallengeReader.java index 4dd7343351f..7e9133315aa 100644 --- a/forge-gui/src/main/java/forge/quest/io/QuestChallengeReader.java +++ b/forge-gui/src/main/java/forge/quest/io/QuestChallengeReader.java @@ -6,7 +6,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import forge.ImageCache; +import forge.ImageKeys; import forge.deck.Deck; import forge.deck.io.DeckSerializer; import forge.properties.NewConstants; @@ -59,7 +59,7 @@ public class QuestChallengeReader extends StorageReaderFolder { qc.setDifficulty(QuestEventDifficulty.fromString(sectionMeta.get("Difficulty"))); qc.setDescription(sectionMeta.get("Description")); qc.setCardReward(sectionMeta.get("Card Reward")); - qc.setIconImageKey(ImageCache.ICON_PREFIX + sectionMeta.get("Icon")); + qc.setIconImageKey(ImageKeys.ICON_PREFIX + sectionMeta.get("Icon")); // Deck qc.setEventDeck(Deck.fromSections(contents)); diff --git a/forge-gui/src/main/java/forge/view/Main.java b/forge-gui/src/main/java/forge/view/Main.java index 1d233e3996b..8d0e6a96535 100644 --- a/forge-gui/src/main/java/forge/view/Main.java +++ b/forge-gui/src/main/java/forge/view/Main.java @@ -17,8 +17,6 @@ */ package forge.view; - -import forge.ImageCacheProvider; import forge.PreferencesProvider; import forge.Singletons; import forge.net.FServer; @@ -38,7 +36,6 @@ public final class Main { System.setProperty("sun.java2d.d3d", "false"); forge.Dependencies.preferences = new PreferencesProvider(); - forge.Dependencies.imagecache = new ImageCacheProvider(); // Start splash screen first, then data models, then controller. if (args.length == 0) {