From dc917643b57dccc32f9ff4dadd0b2d88901815a8 Mon Sep 17 00:00:00 2001 From: Chris H Date: Thu, 21 Mar 2019 20:58:46 -0400 Subject: [PATCH] Allow multiple art for tokens based on edition files --- .../src/main/java/forge/card/CardEdition.java | 18 ++++++++----- .../src/main/java/forge/item/PaperToken.java | 26 ++++++++++++++----- .../java/forge/game/card/token/TokenInfo.java | 5 +--- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java index d9afaef296b..cf9a8b7b4b1 100644 --- a/forge-core/src/main/java/forge/card/CardEdition.java +++ b/forge-core/src/main/java/forge/card/CardEdition.java @@ -21,7 +21,6 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; - import forge.StaticData; import forge.card.CardDb.SetPreference; import forge.deck.CardPool; @@ -31,7 +30,6 @@ import forge.util.*; import forge.util.storage.StorageBase; import forge.util.storage.StorageReaderBase; import forge.util.storage.StorageReaderFolder; - import org.apache.commons.lang3.StringUtils; import java.io.File; @@ -123,7 +121,7 @@ public final class CardEdition implements Comparable { // immutable private boolean smallSetOverride = false; private String boosterMustContain = ""; private final CardInSet[] cards; - private final String[] tokenNormalized; + private final Map tokenNormalized; private int boosterArts = 1; private SealedProduct.Template boosterTpl = null; @@ -133,7 +131,7 @@ public final class CardEdition implements Comparable { // immutable tokenNormalized = null; } - private CardEdition(CardInSet[] cards, String[] tokens) { + private CardEdition(CardInSet[] cards, Map tokens) { this.cards = cards; this.tokenNormalized = tokens; } @@ -191,6 +189,8 @@ public final class CardEdition implements Comparable { // immutable public String getBoosterMustContain() { return boosterMustContain; } public CardInSet[] getCards() { return cards; } + public Map getTokens() { return tokenNormalized; }; + public static final Function FN_GET_CODE = new Function() { @Override public String apply(final CardEdition arg1) { @@ -261,7 +261,7 @@ public final class CardEdition implements Comparable { // immutable protected CardEdition read(File file) { final Map> contents = FileSection.parseSections(FileUtil.readFile(file)); - List tokenNormalized = new ArrayList<>(); + Map tokenNormalized = new HashMap<>(); List processedCards = new ArrayList<>(); if (contents.containsKey("cards")) { for(String line : contents.get("cards")) { @@ -290,13 +290,17 @@ public final class CardEdition implements Comparable { // immutable if (StringUtils.isBlank(line)) continue; - tokenNormalized.add(line); + if (!tokenNormalized.containsKey(line)) { + tokenNormalized.put(line, 1); + } else { + tokenNormalized.put(line, tokenNormalized.get(line) + 1); + } } } CardEdition res = new CardEdition( processedCards.toArray(new CardInSet[processedCards.size()]), - tokenNormalized.toArray(new String[tokenNormalized.size()]) + tokenNormalized ); FileSection section = FileSection.parse(contents.get("metadata"), "="); diff --git a/forge-core/src/main/java/forge/item/PaperToken.java b/forge-core/src/main/java/forge/item/PaperToken.java index b98e94e992c..471121d0cca 100644 --- a/forge-core/src/main/java/forge/item/PaperToken.java +++ b/forge-core/src/main/java/forge/item/PaperToken.java @@ -5,6 +5,7 @@ import forge.card.CardEdition; import forge.card.CardRarity; import forge.card.CardRules; import forge.card.ColorSet; +import forge.util.MyRandom; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; @@ -13,8 +14,9 @@ import java.util.Locale; public class PaperToken implements InventoryItemFromSet, IPaperCard { private String name; private CardEdition edition; - private String imageFileName; + private ArrayList imageFileName = new ArrayList<>(); private CardRules card; + private int artIndex = 0; // takes a string of the form " " such as: "B 0 0 Germ" public static String makeTokenFileName(String in) { @@ -108,12 +110,23 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { this.name = c.getName(); this.edition = edition0; + if (edition.getTokens().containsKey(imageFileName)) { + this.artIndex = edition.getTokens().get(imageFileName); + } + if (imageFileName == null) { // This shouldn't really happen. We can just use the normalized name again for the base image name - this.imageFileName = makeTokenFileName(c, edition0); + this.imageFileName.add(makeTokenFileName(c, edition0)); } else { String formatEdition = null == edition || CardEdition.UNKNOWN == edition ? "" : "_" + edition.getCode().toLowerCase(); - this.imageFileName = String.format("%s%s", imageFileName, formatEdition); + int arts = Math.max(this.artIndex, 1); + for(int idx = 0; idx < arts; idx++) { + if (idx == 0) { + this.imageFileName.add(String.format("%s%s", imageFileName, formatEdition)); + } else { + this.imageFileName.add(String.format("%s%d%s", imageFileName, idx, formatEdition)); + } + } } } @@ -121,14 +134,14 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { @Override public String toString() { return name; } @Override public String getEdition() { return edition != null ? edition.getCode() : "???"; } - @Override public int getArtIndex() { return 0; } // This might change however + @Override public int getArtIndex() { return artIndex; } @Override public boolean isFoil() { return false; } @Override public CardRules getRules() { return card; } @Override public CardRarity getRarity() { return CardRarity.None; } // Unfortunately this is a property of token, cannot move it outside of class - public String getImageFilename() { return imageFileName; } + public String getImageFilename() { return imageFileName.get(0); } @Override public String getItemType() { return "Token"; } @@ -136,6 +149,7 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { @Override public String getImageKey(boolean altState) { - return ImageKeys.TOKEN_PREFIX + imageFileName.replace(" ", "_"); + int idx = MyRandom.getRandom().nextInt() % artIndex; + return ImageKeys.TOKEN_PREFIX + imageFileName.get(idx).replace(" ", "_"); } } diff --git a/forge-game/src/main/java/forge/game/card/token/TokenInfo.java b/forge-game/src/main/java/forge/game/card/token/TokenInfo.java index 044aaf7e8cc..af46b52d072 100644 --- a/forge-game/src/main/java/forge/game/card/token/TokenInfo.java +++ b/forge-game/src/main/java/forge/game/card/token/TokenInfo.java @@ -18,12 +18,11 @@ import forge.game.keyword.KeywordInterface; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.item.PaperToken; +import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; -import org.apache.commons.lang3.StringUtils; - public class TokenInfo { final String name; final String imageName; @@ -129,8 +128,6 @@ public class TokenInfo { c.setName(name); c.setImageKey(ImageKeys.getTokenKey(imageName)); - // TODO - most tokens mana cost is 0, this needs to be fixed - // c.setManaCost(manaCost); c.setColor(color.isEmpty() ? manaCost : color); c.setToken(true);