diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index 33f4b2a665f..6818ac399a6 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -48,6 +48,7 @@ public class StaticData { private boolean allowCustomCardsInDecksConformance; private boolean enableSmartCardArtSelection; + private boolean enableSmartTokenSelection; private boolean loadNonLegalCards; private boolean sourceImageForClone; @@ -65,16 +66,17 @@ public class StaticData { private static StaticData lastInstance = null; public StaticData(CardStorageReader cardReader, CardStorageReader customCardReader, String editionFolder, String customEditionsFolder, String blockDataFolder, String cardArtPreference, boolean enableUnknownCards, boolean loadNonLegalCards) { - this(cardReader, null, customCardReader, null, editionFolder, customEditionsFolder, blockDataFolder, "", cardArtPreference, enableUnknownCards, loadNonLegalCards, false, false); + this(cardReader, null, customCardReader, null, editionFolder, customEditionsFolder, blockDataFolder, "", cardArtPreference, enableUnknownCards, loadNonLegalCards, false, false, false); } - public StaticData(CardStorageReader cardReader, CardStorageReader tokenReader, CardStorageReader customCardReader, CardStorageReader customTokenReader, String editionFolder, String customEditionsFolder, String blockDataFolder, String setLookupFolder, String cardArtPreference, boolean enableUnknownCards, boolean loadNonLegalCards, boolean allowCustomCardsInDecksConformance, boolean enableSmartCardArtSelection) { + public StaticData(CardStorageReader cardReader, CardStorageReader tokenReader, CardStorageReader customCardReader, CardStorageReader customTokenReader, String editionFolder, String customEditionsFolder, String blockDataFolder, String setLookupFolder, String cardArtPreference, boolean enableUnknownCards, boolean loadNonLegalCards, boolean allowCustomCardsInDecksConformance, boolean enableSmartCardArtSelection, boolean enableSmartTokenSelection) { this.cardReader = cardReader; this.tokenReader = tokenReader; this.editions = new CardEdition.Collection(new CardEdition.Reader(new File(editionFolder))); this.blockDataFolder = blockDataFolder; this.allowCustomCardsInDecksConformance = allowCustomCardsInDecksConformance; this.enableSmartCardArtSelection = enableSmartCardArtSelection; + this.enableSmartTokenSelection = enableSmartTokenSelection; this.loadNonLegalCards = loadNonLegalCards; lastInstance = this; Set funnyCards = new HashSet<>(); @@ -153,7 +155,7 @@ public StaticData(CardStorageReader cardReader, CardStorageReader tokenReader, C tokens.put(card.getNormalizedName(), card); } } - allTokens = new TokenDb(tokens, editions); + allTokens = new TokenDb(tokens, editions, enableSmartTokenSelection); } else { allTokens = null; } diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java index 697ccd3a345..d90e957628e 100644 --- a/forge-core/src/main/java/forge/card/CardEdition.java +++ b/forge-core/src/main/java/forge/card/CardEdition.java @@ -921,13 +921,19 @@ public CardEdition get(final String code) { return baseResult == null ? aliasToEdition.get(code) : baseResult; } - public Iterable getOrderedEditions() { + public Iterable getOrderedEditions(boolean latestFirst) { List res = Lists.newArrayList(this); Collections.sort(res); - Collections.reverse(res); + if (latestFirst) { + Collections.reverse(res); + } return res; } + public Iterable getOrderedEditions() { + return getOrderedEditions(true); + } + public Iterable getPrereleaseEditions() { return this.stream() .filter(edition -> edition.getPrerelease() != null) diff --git a/forge-core/src/main/java/forge/token/TokenDb.java b/forge-core/src/main/java/forge/token/TokenDb.java index 9cfc5e44949..624148e6df2 100644 --- a/forge-core/src/main/java/forge/token/TokenDb.java +++ b/forge-core/src/main/java/forge/token/TokenDb.java @@ -5,12 +5,14 @@ import com.google.common.collect.Maps; import com.google.common.collect.Multimap; +import forge.StaticData; import forge.card.CardDb; import forge.card.CardEdition; import forge.card.CardRules; import forge.item.IPaperCard; import forge.item.PaperToken; import forge.util.Aggregates; +import org.apache.commons.lang3.function.Predicates; import java.util.*; import java.util.function.Predicate; @@ -35,9 +37,12 @@ public class TokenDb implements ITokenDatabase { private final CardEdition.Collection editions; private final Map rulesByName; - public TokenDb(Map rules, CardEdition.Collection editions) { + private boolean smartTokenSelection; + + public TokenDb(Map rules, CardEdition.Collection editions, boolean smartTokenSelection) { this.rulesByName = rules; this.editions = editions; + this.smartTokenSelection = smartTokenSelection; } public boolean containsRule(String rule) { @@ -84,14 +89,54 @@ protected PaperToken addTokenInSet(CardEdition edition, String name, CardEdition } // try all editions to find token - protected PaperToken fallbackToken(String name) { - for (CardEdition edition : this.editions) { + protected PaperToken fallbackToken(String name, CardEdition realEdition) { + if (smartTokenSelection) { + return smartFallbackToken(name, realEdition); + } else { + for (CardEdition edition : this.editions) { + String fullName = String.format("%s_%s", name, edition.getCode().toLowerCase()); + if (loadTokenFromSet(edition, name)) { + return Aggregates.random(allTokenByName.get(fullName)); + } + } + } + return null; + } + + // Find latest token before release of original card, or earliest after that + private PaperToken smartFallbackToken(String name, CardEdition realEdition) { + + // Try to optimistically adhere to CardArtPreference and filter out special editions other than realEdition's own type first + final EnumSet specialEditions = EnumSet.of(CardEdition.Type.FUNNY, CardEdition.Type.ONLINE, CardEdition.Type.OTHER); + specialEditions.remove(realEdition.getType()); + CardDb.CardArtPreference artPreference = StaticData.instance().getCardArtPreference(); + + PaperToken paperToken = smartFallbackToken(name, realEdition, Predicate.not( + edition -> specialEditions.contains(edition.getType())).and(artPreference::accept)); + + // Further fall back if a token still isn't found, try all editions without filtering + return paperToken != null ? paperToken : smartFallbackToken(name, realEdition, Predicates.truePredicate()); + } + + private PaperToken smartFallbackToken(String name, CardEdition realEdition, Predicate eligible) { + String lastMatchedKey = null; + boolean reachedRealEdition = false; // This is to find the closest edition to realEdition, rather than terminate at the first (earliest) result + for (CardEdition edition : this.editions.getOrderedEditions(false)) { + if (edition.equals(realEdition)) { + reachedRealEdition = true; + } + if (!eligible.test(edition)) { + continue; + } String fullName = String.format("%s_%s", name, edition.getCode().toLowerCase()); if (loadTokenFromSet(edition, name)) { - return Aggregates.random(allTokenByName.get(fullName)); + lastMatchedKey = fullName; + } + if (reachedRealEdition && lastMatchedKey != null) { + break; } } - return null; + return lastMatchedKey != null ? Aggregates.random(allTokenByName.get(lastMatchedKey)) : null; } @Override @@ -119,7 +164,7 @@ public PaperToken getToken(String tokenName, String edition, int artIndex) { return Iterables.get(collection, artIndex - 1); } - PaperToken fallback = this.fallbackToken(tokenName); + PaperToken fallback = this.fallbackToken(tokenName, realEdition); if (fallback != null) { return fallback; } 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 acc21fd27fa..a1982086693 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 @@ -135,6 +135,7 @@ public void initialize() { lstControls.add(Pair.of(view.getCbAllowCustomCardsDeckConformance(), FPref.ALLOW_CUSTOM_CARDS_IN_DECKS_CONFORMANCE)); lstControls.add(Pair.of(view.getCbUseExperimentalNetworkStream(), FPref.UI_NETPLAY_COMPAT)); lstControls.add(Pair.of(view.getCbImageFetcher(), FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER)); + lstControls.add(Pair.of(view.getCbSmartTokenArt(), FPref.UI_ENABLE_SMART_TOKEN_ART)); lstControls.add(Pair.of(view.getCbDisableCardImages(), FPref.UI_DISABLE_CARD_IMAGES)); lstControls.add(Pair.of(view.getCbDisplayFoil(), FPref.UI_OVERLAY_FOIL_EFFECT)); lstControls.add(Pair.of(view.getCbRandomFoil(), FPref.UI_RANDOM_FOIL)); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java index c2068b6b785..64ba6b1d8fd 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java @@ -84,6 +84,7 @@ public enum VSubmenuPreferences implements IVSubmenu { private final JCheckBox cbSROptimize = new OptionsCheckBox(localizer.getMessage("cbSROptimize")); private final JCheckBox cbFilteredHands = new OptionsCheckBox(localizer.getMessage("cbFilteredHands")); private final JCheckBox cbImageFetcher = new OptionsCheckBox(localizer.getMessage("cbImageFetcher")); + private final JCheckBox cbSmartTokenArt = new OptionsCheckBox(localizer.getMessage("cbSmartTokenArt")); private final JCheckBox cbDisableCardImages = new OptionsCheckBox(localizer.getMessage("lblDisableCardImages")); private final JCheckBox cbCloneImgSource = new OptionsCheckBox(localizer.getMessage("cbCloneImgSource")); private final JCheckBox cbScaleLarger = new OptionsCheckBox(localizer.getMessage("cbScaleLarger")); @@ -390,6 +391,9 @@ public enum VSubmenuPreferences implements IVSubmenu { pnlPrefs.add(cbImageFetcher, titleConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlImageFetcher")), descriptionConstraints); + pnlPrefs.add(cbSmartTokenArt, titleConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlSmartTokenArt")), descriptionConstraints); + pnlPrefs.add(cbDisableCardImages, titleConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlDisableCardImages")), descriptionConstraints); @@ -739,6 +743,10 @@ public JCheckBox getCbImageFetcher() { return cbImageFetcher; } + public JCheckBox getCbSmartTokenArt() { + return cbSmartTokenArt; + } + /** @return {@link javax.swing.JCheckBox} */ public JCheckBox getCbDisableCardImages() { return cbDisableCardImages; diff --git a/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java b/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java index 79968fcfcbc..c2c78a55992 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/SettingsScene.java @@ -279,6 +279,7 @@ public void changed(ChangeEvent event, Actor actor) { addCheckBox(Forge.getLocalizer().getMessage("lblCardID"), ForgePreferences.FPref.UI_OVERLAY_CARD_ID); addCheckBox(Forge.getLocalizer().getMessage("lblAbilityIcon"), ForgePreferences.FPref.UI_OVERLAY_ABILITY_ICONS); addCheckBox(Forge.getLocalizer().getMessage("cbImageFetcher"), ForgePreferences.FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER); + addCheckBox(Forge.getLocalizer().getMessage("cbSmartTokenArt"), ForgePreferences.FPref.UI_ENABLE_SMART_TOKEN_ART); if (!GuiBase.isAndroid()) { diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index 25b1c9ec8ba..4eb59181775 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -494,6 +494,9 @@ public void select() { lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER, Forge.getLocalizer().getMessage("cbImageFetcher"), Forge.getLocalizer().getMessage("nlImageFetcher")), 4); + lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_SMART_TOKEN_ART, + Forge.getLocalizer().getMessage("cbSmartTokenArt"), + Forge.getLocalizer().getMessage("nlSmartTokenArt")), 4); lstSettings.addItem(new CustomSelectSetting(FPref.UI_PREFERRED_ART, Forge.getLocalizer().getMessage("lblPreferredArt"), Forge.getLocalizer().getMessage("nlPreferredArt"), diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 0001a3722de..20aad3b9379 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -105,6 +105,7 @@ cbPerformanceMode=Performance-Modus cbOrderHand=Keep Hand ordered cbFilteredHands=Alternative Starthand cbImageFetcher=Lade automatisch fehlende Kartenbilder +cbSmartTokenArt=Use closest set for token art cbCloneImgSource=Klone zeigen eigenes Kartenbild cbScaleLarger=Skaliere Bilder größer cbRenderBlackCardBorders=Zeige schwarzen Rand @@ -223,6 +224,7 @@ nlDefaultFontSize=Die Standardschriftgröße. Alle Schriftelemente werden relati nlCardArtFormat=Format der Kartenbilder (Full: Bilder ganzen Karte; Crop: nur Bildteil der Karte) cbpMulliganRule=Mulligan Regel nlImageFetcher=Ermöglicht bei bestehender Onlineverbindung das automatisches Nachladen fehlender Kartenbilder. +nlSmartTokenArt=If token art is not available in the card's set, use the closest available set instead of picking at random. nlDisplayFoil=Zeige FOIL-Karten mit einem optischen FOIL-Effekt. nlRandomFoil=Zeige den FOIL-Effekt bei zufälligen Karten. nlScaleLarger=Erlaubt Kartenbilder größer als ihre originale Größe zu zeigen. diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index d624acb5097..2fce2097545 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -106,6 +106,7 @@ cbPerformanceMode=Performance Mode cbOrderHand=Keep Hand ordered cbFilteredHands=Filtered Hands cbImageFetcher=Automatically Download Missing Card Art +cbSmartTokenArt=Use closest set for token art cbCloneImgSource=Clones Use Original Card Art cbScaleLarger=Scale Image Larger cbRenderBlackCardBorders=Render Black Card Borders @@ -228,6 +229,7 @@ nlCardArtFormat=The format of card art images. (Full: image of entire card. Crop nlDefaultFontSize=The default font size within the UI. All font elements are scaled relative to this. (REQUIRES RESTART) cbpMulliganRule = Mulligan Rule nlImageFetcher=Enables live fetching of missing card images from an online resource. +nlSmartTokenArt=If token art is not available in the card's set, use the closest available set instead of picking at random. nlDisplayFoil=Displays foil cards with the visual foil overlay effect. nlRandomFoil=Adds foil effect to random cards. nlScaleLarger=Allows card pictures to be expanded larger than their original size. diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index e0590e5b254..3c3a90a7a7c 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -80,6 +80,7 @@ cbPerformanceMode=Modo de desempeño cbOrderHand=Keep Hand ordered cbFilteredHands=Manos filtradas cbImageFetcher=Descargar automáticamente el arte de la carta si no existe +cbSmartTokenArt=Usar la colección más cercana para las fichas cbCloneImgSource=Clones usan el arte original de la carta cbScaleLarger=Imagen de escala más grande cbRenderBlackCardBorders=Renderizar bordes de cartas negras @@ -199,6 +200,7 @@ nlDefaultFontSize=El tamaño de fuente predeterminado dentro de la interfaz de u nlCardArtFormat=El formato de las imágenes del arte de la carta. (Full: imagen de toda la carta. Crop: sólo la parte del arte) cbpMulliganRule=Regla de mulligan nlImageFetcher=Permite la descarga al vuelo de las imágenes de cartas que falten. +nlSmartTokenArt=Si la ilustración de la ficha no está disponible en la colección de la carta, usa la colección disponible más cercana en lugar de elegirla al azar nlDisplayFoil=Mostrar las cartas foil con un capa sobre la carta que da efecto foil nlRandomFoil=Agrega efecto de foil a cartas aleatorias. nlScaleLarger=Permite que las imágenes de las cartas se amplíen más que su tamaño original. diff --git a/forge-gui/res/languages/fr-FR.properties b/forge-gui/res/languages/fr-FR.properties index 443f975476c..d97dcec284a 100644 --- a/forge-gui/res/languages/fr-FR.properties +++ b/forge-gui/res/languages/fr-FR.properties @@ -79,6 +79,7 @@ cbPerformanceMode=Mode Performances cbOrderHand=Keep Hand ordered cbFilteredHands=Mains filtrées cbImageFetcher=Télécharger automatiquement l'illustration de la carte manquante +cbSmartTokenArt=Utiliser l'extension la plus proche pour les jetons cbCloneImgSource=Les clones utilisent l'illustration originale de la carte cbScaleLarger=Agrandir l'image cbRenderBlackCardBorders=Rendre les bordures noires de la carte @@ -197,6 +198,7 @@ nlCardArtFormat=Le format des images d'art de la carte. (Plein : image de la car nlDefaultFontSize=La taille de police par défaut dans l'interface utilisateur. Tous les éléments de police sont mis à l'échelle par rapport à cela. (NÉCESSITE UN REDÉMARRAGE) cbpMulliganRule=règle de Mulligan nlImageFetcher=Active la récupération en direct des images de cartes manquantes à partir d'une ressource en ligne. +nbSmartTokenArt=Si une illustration du jeton n'est pas disponible dans l'extension de la carte, utiliser l'extension disponible la plus proche au lieu de choisir au hasard. nlDisplayFoil=Affiche les cartes brillantes avec l'effet visuel de superposition de feuille. nlRandomFoil=Ajoute un effet foil aux cartes aléatoires. nlScaleLarger=Permet aux images de la carte d'être agrandies au-delà de leur taille d'origine. diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index 2d855930a70..d93cf45798d 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -78,6 +78,7 @@ cbPerformanceMode=Modalità alte prestazioni cbOrderHand=Keep Hand ordered cbFilteredHands=Mani Filtrate cbImageFetcher=Scarica automaticamente l'arte delle carte mancanti +cbSmartTokenArt=Usa il set piu' vicino per i token cbCloneImgSource=I cloni usano l'arte della carta originale cbScaleLarger=Ingrandisci l'immagine cbRenderBlackCardBorders=Disegna i bordi neri delle carte @@ -196,6 +197,7 @@ nlDefaultFontSize=La dimensione predefinita dei caratteri nell'interfaccia utent nlCardArtFormat=Formato delle Illustrazioni delle carte. (Full: Immagine per intero della carta. Crop: Solo illustrazione) cbpMulliganRule=Tipo di Mulligan nlImageFetcher=Consente il recupero in tempo reale delle immagini mancanti da una risorsa online. +nlSmartTokenArt=Se l'illustrazione del token non e' disponibile nell'espansione della carta, usa l'espansione disponibile piu' vicina invece di una scelta casuale. nlDisplayFoil=Visualizza le carte foil con l'effetto di sovrapposizione foil visivo. nlRandomFoil=Aggiunge l'effetto foil alle carte casuali. nlScaleLarger=Consente di espandere le immagini delle carte più grandi delle loro dimensioni originali. diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index 8039d32e022..ec6bdc3f835 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -79,6 +79,7 @@ cbPerformanceMode=パフォーマンスモード cbOrderHand=Keep Hand ordered cbFilteredHands=初期ハンド補正 cbImageFetcher=欠落したカード画像を自動的にダウンロードする +cbSmartTokenArt=Use closest set for token art cbCloneImgSource=コピーカードは元のカード画像を使用します cbScaleLarger=画像を拡大する cbRenderBlackCardBorders=黒枠のレンダリング @@ -197,6 +198,7 @@ nlDefaultFontSize=UI 内のデフォルトのフォントサイズ。 すべて nlCardArtFormat=カード描画時使うアートのフォーマット(Full: カード全体の画像を使う。Crop: カードのアートの部分の画像だけを使う。) cbpMulliganRule =マリガンルール nlImageFetcher=オンラインサーバーから欠落しているカード画像の動的にフェッチを有効にします。 +nlSmartTokenArt=If token art is not available in the card's set, use the closest available set instead of picking at random. nlDisplayFoil=視覚的フォイルオーバーレイ効果のあるフォイルカードを表示します。 nlRandomFoil=ランダムなカードにフォイル効果を追加します。 nlScaleLarger=カード画像を元のサイズより大きく拡大できます。 diff --git a/forge-gui/res/languages/pt-BR.properties b/forge-gui/res/languages/pt-BR.properties index f756f29f887..68a7e83118b 100644 --- a/forge-gui/res/languages/pt-BR.properties +++ b/forge-gui/res/languages/pt-BR.properties @@ -80,6 +80,7 @@ cbPerformanceMode=Modo de Desempenho cbOrderHand=Keep Hand ordered cbFilteredHands=Mãos Filtradas cbImageFetcher=Baixar Automaticamente a Arte de Cartas Ausentes +cbSmartTokenArt=Use closest set for token art cbCloneImgSource=Clones Usam a Arte da Carta Origem cbScaleLarger=Expandir Imagem cbRenderBlackCardBorders=Renderizar Bordas Pretas de Carta @@ -198,6 +199,7 @@ nlCardArtFormat=O formato das imagens de arte da carta. (Total\: imagem inteira nlDefaultFontSize=O tamanho padrão da fonte dentro da interface do usuário. Todos os elementos de fonte são dimensionados em relação a isso. (REQUER REINÍCIO) cbpMulliganRule = Regra de Mulligan nlImageFetcher=Habilita a busca sob demanda das imagens das cartas ausentes a partir de um repositório online. +nlSmartTokenArt=If token art is not available in the card's set, use the closest available set instead of picking at random. nlDisplayFoil=Exibe cartas cromadas com o efeito de camada cromada. nlRandomFoil=Adiciona o efeito cromado a cartas aleatórias. nlScaleLarger=Permite que as imagens das cartas sejam expandidas maior que o tamanho original. diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index f2fae152653..636b82e0b68 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -80,6 +80,7 @@ cbPerformanceMode=性能模式 cbOrderHand=Keep Hand ordered cbFilteredHands=手牌过滤 cbImageFetcher=自动下载缺失的图片 +cbSmartTokenArt=使用最接近系列的衍生物插画 cbCloneImgSource=复制使用原始的图片 cbScaleLarger=将图像缩放的更大 cbRenderBlackCardBorders=渲染黑卡边框 @@ -199,6 +200,7 @@ nlDefaultFontSize=UI中字体的默认大小。所有字体元素都相对于此 nlCardArtFormat=牌图的格式。(Full表示使用完整的牌张图片,Crop表示只使用牌图的插画部分) cbpMulliganRule = 调度规则 nlImageFetcher=允许从在线资源中实时获取缺失的图片 +nlSmartTokenArt=如果该牌所属系列中没有可用的衍生物插画,则使用最接近的可用系列,而不是随机选择 nlDisplayFoil=显示闪卡 nlRandomFoil=随机将牌设置为闪卡 nlScaleLarger=允许卡牌图片缩放为初始大小 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 8fce9d9ef09..85a2cdb5ac2 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java @@ -90,6 +90,7 @@ public enum FPref implements PreferencesStore.IPref { UI_OVERLAY_ABILITY_ICONS("true"), UI_OVERLAY_DRAFT_RANKING("true"), UI_ENABLE_ONLINE_IMAGE_FETCHER ("true"), + UI_ENABLE_SMART_TOKEN_ART ("false"), UI_PREFERRED_ART("LATEST_ART_ALL_EDITIONS"), UI_SMART_CARD_ART("false"), UI_AUTO_AIDECK_SELECTION("true"), diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index 36f477b6ed3..87ddcb5440a 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -85,7 +85,8 @@ private FModel() { } //don't allow creating instance getPreferences().getPrefBoolean(FPref.UI_LOAD_UNKNOWN_CARDS), getPreferences().getPrefBoolean(FPref.UI_LOAD_NONLEGAL_CARDS), getPreferences().getPrefBoolean(FPref.ALLOW_CUSTOM_CARDS_IN_DECKS_CONFORMANCE), - getPreferences().getPrefBoolean(FPref.UI_SMART_CARD_ART))); + getPreferences().getPrefBoolean(FPref.UI_SMART_CARD_ART), + getPreferences().getPrefBoolean(FPref.UI_ENABLE_SMART_TOKEN_ART))); private static final Supplier questPreferences = Suppliers.memoize(QuestPreferences::new); private static final Supplier conquestPreferences = Suppliers.memoize(() -> { final ConquestPreferences cp = new ConquestPreferences();