diff --git a/forge-core/src/main/java/forge/item/IPaperCard.java b/forge-core/src/main/java/forge/item/IPaperCard.java index 36ad4812e54..b71f774fdd6 100644 --- a/forge-core/src/main/java/forge/item/IPaperCard.java +++ b/forge-core/src/main/java/forge/item/IPaperCard.java @@ -236,7 +236,9 @@ public interface IPaperCard extends InventoryItem, Serializable { CardRules getRules(); CardRarity getRarity(); String getArtist(); - String getItemType(); + boolean hasBackFace(); + String getCardImageKey(); + String getCardAltImageKey(); } \ 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 6cf473f85ed..674db94fb7d 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -20,10 +20,7 @@ package forge.item; import com.google.common.base.Function; import forge.ImageKeys; import forge.StaticData; -import forge.card.CardDb; -import forge.card.CardEdition; -import forge.card.CardRarity; -import forge.card.CardRules; +import forge.card.*; import forge.util.CardTranslation; import forge.util.ImageUtil; import forge.util.Localizer; @@ -141,13 +138,6 @@ public final class PaperCard implements Comparable, InventoryItemFro return hasImage; } - private String imageKeyFromSet = null; - public String getImageKeyFromSet() { - if (this.imageKeyFromSet == null) - this.imageKeyFromSet = ImageUtil.getImageKey(this, false, true); - return imageKeyFromSet; - } - /** * Lambda to get rules for selects from list of printed cards. */ @@ -308,6 +298,32 @@ public final class PaperCard implements Comparable, InventoryItemFro return imageKey; } + private String cardImageKey = null; + @Override + public String getCardImageKey() { + if (this.cardImageKey == null) + this.cardImageKey = ImageUtil.getImageKey(this, false, true); + return cardImageKey; + } + + private String cardAltImageKey = null; + @Override + public String getCardAltImageKey() { + if (this.cardAltImageKey == null){ + if (this.hasBackFace()) + this.cardAltImageKey = ImageUtil.getImageKey(this, true, true); + else // altImageKey will be the same as cardImageKey + this.cardAltImageKey = ImageUtil.getImageKey(this, false, true); + } + return cardAltImageKey; + } + + @Override + public boolean hasBackFace(){ + CardSplitType cst = this.rules.getSplitType(); + return cst == CardSplitType.Transform || cst == CardSplitType.Flip || cst == CardSplitType.Meld || cst == CardSplitType.Modal; + } + // Return true if card is one of the five basic lands that can be added for free public boolean isVeryBasicLand() { return (this.getName().equals("Swamp")) diff --git a/forge-core/src/main/java/forge/item/PaperToken.java b/forge-core/src/main/java/forge/item/PaperToken.java index ef15dee7673..5467ca2cb1b 100644 --- a/forge-core/src/main/java/forge/item/PaperToken.java +++ b/forge-core/src/main/java/forge/item/PaperToken.java @@ -151,8 +151,25 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { @Override public String getItemType() { return "Token"; } + @Override + public boolean hasBackFace() { + return false; + } + @Override public boolean isToken() { return true; } + // IPaperCard + @Override + public String getCardImageKey() { + return this.getImageKey(false); + } + + @Override + public String getCardAltImageKey() { + return getImageKey(true); + } + + // InventoryItem @Override public String getImageKey(boolean altState) { int idx = MyRandom.getRandom().nextInt(artIndex); diff --git a/forge-core/src/main/java/forge/util/ImageUtil.java b/forge-core/src/main/java/forge/util/ImageUtil.java index 5b2c0488e6a..7606aaa7b39 100644 --- a/forge-core/src/main/java/forge/util/ImageUtil.java +++ b/forge-core/src/main/java/forge/util/ImageUtil.java @@ -83,15 +83,10 @@ public class ImageUtil { } } - public static boolean hasBackFacePicture(PaperCard cp) { - CardSplitType cst = cp.getRules().getSplitType(); - return cst == CardSplitType.Transform || cst == CardSplitType.Flip || cst == CardSplitType.Meld || cst == CardSplitType.Modal; - } - public static String getNameToUse(PaperCard cp, boolean backFace) { final CardRules card = cp.getRules(); if (backFace) { - if (hasBackFacePicture(cp)) + if (cp.hasBackFace()) if (card.getOtherPart() != null) { return card.getOtherPart().getName(); } else if (!card.getMeldWith().isEmpty()) { diff --git a/forge-core/src/main/java/forge/util/ItemPool.java b/forge-core/src/main/java/forge/util/ItemPool.java index f8caf2d4061..6cf22ec2162 100644 --- a/forge-core/src/main/java/forge/util/ItemPool.java +++ b/forge-core/src/main/java/forge/util/ItemPool.java @@ -30,6 +30,7 @@ import java.util.concurrent.ConcurrentHashMap; import com.google.common.base.Function; import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; import forge.item.InventoryItem; /** @@ -149,12 +150,14 @@ public class ItemPool implements Iterable int countAll(Predicate condition, Class cls) { int count = 0; - for (Entry e : this) { - T item = e.getKey(); - if (cls.isInstance(item) && condition.apply((U)item)) { - count += e.getValue(); + Iterable matchingKeys = Iterables.filter(this.items.keySet(), new Predicate() { + @Override + public boolean apply(T item) { + return cls.isInstance(item) && condition.apply((U)item); } - } + }); + for (T key : matchingKeys) + count += this.items.get(key); return count; } diff --git a/forge-gui-desktop/src/main/java/forge/ImageCache.java b/forge-gui-desktop/src/main/java/forge/ImageCache.java index c0ccc099fe3..22317de4636 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageCache.java +++ b/forge-gui-desktop/src/main/java/forge/ImageCache.java @@ -168,11 +168,11 @@ public class ImageCache { if (altState) imageKey = imageKey.substring(0, imageKey.length() - ImageKeys.BACKFACE_POSTFIX.length()); if (imageKey.startsWith(ImageKeys.CARD_PREFIX)) { - PaperCard pc = ImageUtil.getPaperCardFromImageKey(imageKey); - ipc = pc; - imageKey = ImageUtil.getImageKey(pc, altState, true); - if (StringUtils.isBlank(imageKey)) { - return Pair.of(_defaultImage, true); + ipc = ImageUtil.getPaperCardFromImageKey(imageKey); + if (ipc != null) { + imageKey = altState ? ipc.getCardAltImageKey() : ipc.getCardImageKey(); + if (StringUtils.isBlank(imageKey)) + return Pair.of(_defaultImage, true); } } @@ -184,7 +184,7 @@ public class ImageCache { if (useArtCrop) { if (ipc != null && ipc.getRules().getSplitType() == CardSplitType.Flip) { // Art crop will always use front face as image key for flip cards - imageKey = ((PaperCard) ipc).getImageKeyFromSet(); // ImageUtil.getImageKey((PaperCard) ipc, false, true); + imageKey = ((PaperCard) ipc).getCardImageKey(); } imageKey = TextUtil.fastReplace(imageKey, ".full", ".artcrop"); } diff --git a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java index 3dd14713344..313595af0d1 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java @@ -35,7 +35,6 @@ import forge.item.PaperCard; import forge.localinstance.properties.ForgeConstants; import forge.model.FModel; import forge.util.FileUtil; -import forge.util.ImageUtil; public class ImportSourceAnalyzer { @@ -315,7 +314,7 @@ public class ImportSourceAnalyzer { for (final PaperCard c : FModel.getMagicDb().getCommonCards().getAllCards()) { addDefaultPicNames(c, false); - if (ImageUtil.hasBackFacePicture(c)) { + if (c.hasBackFace()) { addDefaultPicNames(c, true); } } @@ -360,10 +359,10 @@ public class ImportSourceAnalyzer { private static void addSetCards(final Map cardFileNames, final Iterable library, final Predicate filter) { for (final PaperCard c : Iterables.filter(library, filter)) { - String filename = ImageUtil.getImageKey(c, false, true) + ".jpg"; + String filename = c.getCardImageKey() + ".jpg"; cardFileNames.put(filename, filename); - if (ImageUtil.hasBackFacePicture(c)) { - filename = ImageUtil.getImageKey(c, true, true) + ".jpg"; + if (c.hasBackFace()) { + filename = c.getCardAltImageKey() + ".jpg"; cardFileNames.put(filename, filename); } } @@ -392,10 +391,10 @@ public class ImportSourceAnalyzer { }; for (final PaperCard c : Iterables.filter(FModel.getMagicDb().getVariantCards().getAllCards(), predPlanes)) { - String baseName = ImageUtil.getImageKey(c,false, true); + String baseName = c.getCardImageKey(); nameUpdates.put(baseName + ".full.jpg", baseName + ".jpg"); - if (ImageUtil.hasBackFacePicture(c)) { - baseName = ImageUtil.getImageKey(c, true, true); + if (c.hasBackFace()) { + baseName = c.getCardAltImageKey(); nameUpdates.put(baseName + ".full.jpg", baseName + ".jpg"); } } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java index 49d785edbdc..cfc2041798a 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java @@ -1,6 +1,7 @@ package forge.itemmanager.filters; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import javax.swing.JPanel; @@ -76,10 +77,12 @@ public abstract class StatTypeFilter extends ToggleButt btnPackOrDeck.setText(String.valueOf(count)); } - for (Map.Entry btn : buttonMap.entrySet()) { - if (btn.getKey().predicate != null) { - int count = items.countAll(Predicates.compose(btn.getKey().predicate, PaperCard.FN_GET_RULES), PaperCard.class); - btn.getValue().setText(String.valueOf(count)); + Iterator buttonMapStatsIterator = buttonMap.keySet().iterator(); + while (buttonMapStatsIterator.hasNext()){ + StatTypes statTypes = buttonMapStatsIterator.next(); + if (statTypes.predicate != null){ + int count = items.countAll(Predicates.compose(statTypes.predicate, PaperCard.FN_GET_RULES), PaperCard.class); + buttonMap.get(statTypes).setText(String.valueOf(count)); } } getWidget().revalidate(); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java index 8dac7948aaa..85cb5cb071f 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java @@ -23,7 +23,6 @@ import forge.toolbox.FSkin.SkinColor; import forge.toolbox.FSkin.SkinFont; import forge.toolbox.FSkin.SkinImage; import forge.toolbox.special.CardZoomer; -import forge.util.ImageUtil; import forge.util.Localizer; import forge.view.arcane.CardPanel; @@ -61,8 +60,6 @@ public class ImageView extends ItemView { private ItemInfo hoveredItem; private ItemInfo focalItem; private boolean panelOptionsCreated = false; - // cards with alternate states are added twice for displaying - private InventoryItem lastAltCard = null; private final List orderedItems = new ArrayList<>(); private final List groups = new ArrayList<>(); @@ -1103,30 +1100,16 @@ public class ImageView extends ItemView { InventoryItem item = itemInfo.item; itemInfo.alt = false; if (!FModel.getPreferences().getPref(FPref.UI_SWITCH_STATES_DECKVIEW).equals(ForgeConstants.SWITCH_CARDSTATES_DECK_NEVER)) { - if ((hoveredItem == null || !hoveredItem.item.equals(item)) || (FModel.getPreferences().getPref(FPref.UI_SWITCH_STATES_DECKVIEW).equals(ForgeConstants.SWITCH_CARDSTATES_DECK_ALWAYS))) { - if (item instanceof PaperCard) { - if (ImageUtil.hasBackFacePicture(((PaperCard)item))) { - if (item.equals(lastAltCard)) { - itemInfo.alt = true; - lastAltCard = null; - } - else { - lastAltCard = item; - } - } - else { - lastAltCard = null; - } - } + if (hoveredItem != null && hoveredItem.item.equals(item)) { + if (item instanceof PaperCard && ((PaperCard)item).hasBackFace()) + itemInfo.alt = true; } } - if (itemInfo != hoveredItem) { //save hovered item for last + if (itemInfo != hoveredItem) //save hovered item for last drawItemImage(g2d, itemInfo); - } - else { + else skippedItem = itemInfo; - } } } if (skippedItem != null) { //draw hovered item on top diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java index cc1fb85c585..21e3089886d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java @@ -538,7 +538,7 @@ public enum CSubmenuPreferences implements ICDoc { } private void initializeSwitchStatesCombobox() { - final String[] elems = {ForgeConstants.SWITCH_CARDSTATES_DECK_NEVER, ForgeConstants.SWITCH_CARDSTATES_DECK_HOVER, ForgeConstants.SWITCH_CARDSTATES_DECK_ALWAYS}; + final String[] elems = {ForgeConstants.SWITCH_CARDSTATES_DECK_NEVER, ForgeConstants.SWITCH_CARDSTATES_DECK_HOVER}; final FPref userSetting = FPref.UI_SWITCH_STATES_DECKVIEW; final FComboBoxPanel panel = this.view.getSwitchStates(); final FComboBox comboBox = createComboBox(elems, userSetting); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java index a91a687444a..df2272a2fed 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java @@ -306,7 +306,7 @@ public enum VSubmenuDownloaders implements IVSubmenu { // // check the back face // - if (ImageUtil.hasBackFacePicture(cp)) { + if (cp.hasBackFace()) { imagePath = ImageUtil.getImageRelativePath(cp, true, true, false); if (imagePath != null) { File file = ImageKeys.getImageFile(imagePath); 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 79a6a6308fb..34e5babcd9e 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 @@ -30,6 +30,7 @@ import javax.imageio.ImageIO; import forge.ImageCache; import forge.ImageKeys; import forge.game.card.CardView.CardStateView; +import forge.item.PaperCard; import forge.localinstance.properties.ForgePreferences; import forge.model.FModel; import forge.toolbox.CardFaceSymbols; @@ -78,7 +79,9 @@ public final class FImageUtil { boolean altState = key.endsWith(ImageKeys.BACKFACE_POSTFIX); String imageKey = key; if (prefix.equals(ImageKeys.CARD_PREFIX)) { - imageKey = ImageUtil.getImageKey(ImageUtil.getPaperCardFromImageKey(key), altState, true); + PaperCard card = ImageUtil.getPaperCardFromImageKey(key); + if (card != null) + imageKey = altState ? card.getCardAltImageKey() : card.getCardImageKey(); } if(altState) { imageKey = imageKey.substring(0, imageKey.length() - ImageKeys.BACKFACE_POSTFIX.length()); diff --git a/forge-gui-mobile/src/forge/assets/ImageCache.java b/forge-gui-mobile/src/forge/assets/ImageCache.java index 2c2aaab1285..099da2b5a12 100644 --- a/forge-gui-mobile/src/forge/assets/ImageCache.java +++ b/forge-gui-mobile/src/forge/assets/ImageCache.java @@ -164,7 +164,7 @@ public class ImageCache { return false; final boolean backFace = imageKey.endsWith(ImageKeys.BACKFACE_POSTFIX); - final String cardfilename = ImageUtil.getImageKey(paperCard, backFace, true); + final String cardfilename = backFace ? paperCard.getCardAltImageKey() : paperCard.getCardImageKey(); if (!new File(ForgeConstants.CACHE_CARD_PICS_DIR + "/" + cardfilename + ".jpg").exists()) if (!new File(ForgeConstants.CACHE_CARD_PICS_DIR + "/" + cardfilename + ".png").exists()) if (!new File(ForgeConstants.CACHE_CARD_PICS_DIR + "/" + TextUtil.fastReplace(cardfilename,".full", ".fullborder") + ".jpg").exists()) @@ -200,7 +200,9 @@ public class ImageCache { imageKey = imageKey.substring(0, imageKey.length() - ImageKeys.BACKFACE_POSTFIX.length()); } if (imageKey.startsWith(ImageKeys.CARD_PREFIX)) { - imageKey = ImageUtil.getImageKey(ImageUtil.getPaperCardFromImageKey(imageKey), altState, true); + PaperCard card = ImageUtil.getPaperCardFromImageKey(imageKey); + if (card != null) + imageKey = altState ? card.getCardAltImageKey() : card.getCardImageKey(); if (StringUtils.isBlank(imageKey)) { return defaultImage; } diff --git a/forge-gui/src/main/java/forge/gui/download/GuiDownloadPicturesHQ.java b/forge-gui/src/main/java/forge/gui/download/GuiDownloadPicturesHQ.java index 5c2f06ca3f2..69034793916 100644 --- a/forge-gui/src/main/java/forge/gui/download/GuiDownloadPicturesHQ.java +++ b/forge-gui/src/main/java/forge/gui/download/GuiDownloadPicturesHQ.java @@ -47,7 +47,7 @@ public class GuiDownloadPicturesHQ extends GuiDownloadService { for (final PaperCard c : FModel.getMagicDb().getCommonCards().getAllCards()) { addDLObject(c, false); - if (ImageUtil.hasBackFacePicture(c)) { + if (c.hasBackFace()) { addDLObject(c, true); } } diff --git a/forge-gui/src/main/java/forge/gui/download/GuiDownloadPicturesLQ.java b/forge-gui/src/main/java/forge/gui/download/GuiDownloadPicturesLQ.java index e2c927f9ddf..a8022affa13 100644 --- a/forge-gui/src/main/java/forge/gui/download/GuiDownloadPicturesLQ.java +++ b/forge-gui/src/main/java/forge/gui/download/GuiDownloadPicturesLQ.java @@ -49,7 +49,7 @@ public class GuiDownloadPicturesLQ extends GuiDownloadService { for (final PaperCard c : FModel.getMagicDb().getCommonCards().getAllCards()) { addDLObject(c, false); - if (ImageUtil.hasBackFacePicture(c)) { + if (c.hasBackFace()) { addDLObject(c, true); } } diff --git a/forge-gui/src/main/java/forge/gui/download/GuiDownloadSetPicturesLQ.java b/forge-gui/src/main/java/forge/gui/download/GuiDownloadSetPicturesLQ.java index cb1ea0fba3d..34fe252e44a 100644 --- a/forge-gui/src/main/java/forge/gui/download/GuiDownloadSetPicturesLQ.java +++ b/forge-gui/src/main/java/forge/gui/download/GuiDownloadSetPicturesLQ.java @@ -74,7 +74,7 @@ public class GuiDownloadSetPicturesLQ extends GuiDownloadService { addDLObject(ImageUtil.getDownloadUrl(c, false), ImageUtil.getImageKey(c, false, true), downloads); - if (ImageUtil.hasBackFacePicture(c)) { + if (c.hasBackFace()) { addDLObject(ImageUtil.getDownloadUrl(c, true), ImageUtil.getImageKey(c, true, true), downloads); } } diff --git a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java index a94c0abb15e..112a1279ea9 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java @@ -1,7 +1,6 @@ package forge.itemmanager; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map.Entry; @@ -151,7 +150,7 @@ public final class SItemManagerUtil { for (final Entry itemEntry : items) { sorted.add(itemEntry); } - Collections.sort(sorted, new Comparator>() { + sorted.sort(new Comparator>() { @Override public int compare(final Entry x, final Entry y) { return x.getKey().toString().compareTo(y.getKey().toString()); diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java index 47bbc93ee08..e1ea5dce308 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java @@ -353,7 +353,6 @@ public final class ForgeConstants { // Constants for Land played notification policy public static final String SWITCH_CARDSTATES_DECK_NEVER = "Never"; - public static final String SWITCH_CARDSTATES_DECK_ALWAYS = "Always"; public static final String SWITCH_CARDSTATES_DECK_HOVER = "Switch back on hover"; // Set boolean constant for landscape mode for gdx port diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java index a31b50b8cb1..bbf8123b0f1 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java @@ -163,7 +163,7 @@ public class ForgePreferences extends PreferencesStore { UI_CARD_ART_FORMAT("Full"), UI_SELECT_FROM_CARD_DISPLAYS("true"), UI_FOR_TOUCHSCREN("false"), - UI_SWITCH_STATES_DECKVIEW("Always"), + UI_SWITCH_STATES_DECKVIEW("Switch back on hover"), UI_VIBRATE_ON_LIFE_LOSS("true"), UI_VIBRATE_ON_LONG_PRESS("true"), diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java index 4d9798501af..4c86431a4b7 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -79,7 +79,7 @@ public abstract class ImageFetcher { return; final boolean backFace = imageKey.endsWith(ImageKeys.BACKFACE_POSTFIX); - String filename = ImageUtil.getImageKey(paperCard, backFace, true); + String filename = backFace ? paperCard.getCardAltImageKey() : paperCard.getCardImageKey(); if (useArtCrop) { filename = TextUtil.fastReplace(filename, ".full", ".artcrop"); }