Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions forge-core/src/main/java/forge/StaticData.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public class StaticData {

private boolean allowCustomCardsInDecksConformance;
private boolean enableSmartCardArtSelection;
private boolean enableSmartTokenSelection;
private boolean loadNonLegalCards;

private boolean sourceImageForClone;
Expand All @@ -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<String> funnyCards = new HashSet<>();
Expand Down Expand Up @@ -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;
}
Expand Down
10 changes: 8 additions & 2 deletions forge-core/src/main/java/forge/card/CardEdition.java
Original file line number Diff line number Diff line change
Expand Up @@ -920,13 +920,19 @@ public CardEdition get(final String code) {
return baseResult == null ? aliasToEdition.get(code) : baseResult;
}

public Iterable<CardEdition> getOrderedEditions() {
public Iterable<CardEdition> getOrderedEditions(boolean latestFirst) {
List<CardEdition> res = Lists.newArrayList(this);
Collections.sort(res);
Collections.reverse(res);
if (latestFirst) {
Collections.reverse(res);
}
return res;
}

public Iterable<CardEdition> getOrderedEditions() {
return getOrderedEditions(true);
}

public Iterable<CardEdition> getPrereleaseEditions() {
return this.stream()
.filter(edition -> edition.getPrerelease() != null)
Expand Down
49 changes: 43 additions & 6 deletions forge-core/src/main/java/forge/token/TokenDb.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,12 @@ public class TokenDb implements ITokenDatabase {
private final CardEdition.Collection editions;
private final Map<String, CardRules> rulesByName;

public TokenDb(Map<String, CardRules> rules, CardEdition.Collection editions) {
private boolean smartTokenSelection;

public TokenDb(Map<String, CardRules> rules, CardEdition.Collection editions, boolean smartTokenSelection) {
this.rulesByName = rules;
this.editions = editions;
this.smartTokenSelection = smartTokenSelection;
}

public boolean containsRule(String rule) {
Expand Down Expand Up @@ -84,14 +87,48 @@ 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) {
PaperToken coreExpansionReprintToken = smartFallbackToken(name, realEdition, true);
return coreExpansionReprintToken != null ? coreExpansionReprintToken : smartFallbackToken(name, realEdition, false);
}

private PaperToken smartFallbackToken(String name, CardEdition realEdition, boolean onlyCoreExpansionOrReprint) {
String latestFound = null;
boolean pastRealEdition = false;
final EnumSet<CardEdition.Type> coreExpansionOrReprint = EnumSet.of(CardEdition.Type.CORE, CardEdition.Type.EXPANSION);
coreExpansionOrReprint.addAll(CardEdition.Type.REPRINT_SET_TYPES);
for (CardEdition edition : this.editions.getOrderedEditions(false)) {
if (edition.equals(realEdition)) {
pastRealEdition = true;
}
if (onlyCoreExpansionOrReprint && !coreExpansionOrReprint.contains(edition.getType())) {
// Core, Expansion and Reprint sets are more likely to have available token images
continue;
}
String fullName = String.format("%s_%s", name, edition.getCode().toLowerCase());
if (loadTokenFromSet(edition, name)) {
return Aggregates.random(allTokenByName.get(fullName));
latestFound = fullName;
}
if (pastRealEdition && latestFound != null) {
break;
}
}
return null;
return latestFound != null ? Aggregates.random(allTokenByName.get(latestFound)) : null;
}

@Override
Expand Down Expand Up @@ -119,7 +156,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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,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));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
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"));
Expand Down Expand Up @@ -388,6 +389,9 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
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);

Expand Down Expand Up @@ -736,6 +740,10 @@ public JCheckBox getCbImageFetcher() {
return cbImageFetcher;
}

public JCheckBox getCbSmartTokenArt() {
return cbSmartTokenArt;
}

/** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbDisableCardImages() {
return cbDisableCardImages;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,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()) {
Expand Down
3 changes: 3 additions & 0 deletions forge-gui-mobile/src/forge/screens/settings/SettingsPage.java
Original file line number Diff line number Diff line change
Expand Up @@ -466,6 +466,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"),
Expand Down
2 changes: 2 additions & 0 deletions forge-gui/res/languages/de-DE.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
2 changes: 2 additions & 0 deletions forge-gui/res/languages/en-US.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
2 changes: 2 additions & 0 deletions forge-gui/res/languages/es-ES.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
2 changes: 2 additions & 0 deletions forge-gui/res/languages/fr-FR.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
2 changes: 2 additions & 0 deletions forge-gui/res/languages/it-IT.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
2 changes: 2 additions & 0 deletions forge-gui/res/languages/ja-JP.properties
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ cbPerformanceMode=パフォーマンスモード
cbOrderHand=Keep Hand ordered
cbFilteredHands=初期ハンド補正
cbImageFetcher=欠落したカード画像を自動的にダウンロードする
cbSmartTokenArt=Use closest set for token art
cbCloneImgSource=コピーカードは元のカード画像を使用します
cbScaleLarger=画像を拡大する
cbRenderBlackCardBorders=黒枠のレンダリング
Expand Down Expand Up @@ -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=カード画像を元のサイズより大きく拡大できます。
Expand Down
2 changes: 2 additions & 0 deletions forge-gui/res/languages/pt-BR.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
2 changes: 2 additions & 0 deletions forge-gui/res/languages/zh-CN.properties
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ cbPerformanceMode=性能模式
cbOrderHand=Keep Hand ordered
cbFilteredHands=手牌过滤
cbImageFetcher=自动下载缺失的图片
cbSmartTokenArt=使用最接近系列的衍生物插画
cbCloneImgSource=复制使用原始的图片
cbScaleLarger=将图像缩放的更大
cbRenderBlackCardBorders=渲染黑卡边框
Expand Down Expand Up @@ -199,6 +200,7 @@ nlDefaultFontSize=UI中字体的默认大小。所有字体元素都相对于此
nlCardArtFormat=牌图的格式。(Full表示使用完整的牌张图片,Crop表示只使用牌图的插画部分)
cbpMulliganRule = 调度规则
nlImageFetcher=允许从在线资源中实时获取缺失的图片
nlSmartTokenArt=如果该牌所属系列中没有可用的衍生物插画,则使用最接近的可用系列,而不是随机选择
nlDisplayFoil=显示闪卡
nlRandomFoil=随机将牌设置为闪卡
nlScaleLarger=允许卡牌图片缩放为初始大小
Expand Down
Loading