diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 998593fa468..15d4687e32d 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -148,6 +148,19 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return !StringUtils.isNumeric(s); } + private static CardRequest fromPreferredArtEntry(String preferredArt, boolean isFoil){ + // Preferred Art Entry are supposed to be cardName|setCode|artIndex only + String[] info = TextUtil.split(preferredArt, NameSetSeparator); + if (info.length != 3) + return null; + try { + String cardName = info[0]; + String setCode = info[1]; + int artIndex = Integer.parseInt(info[2]); + return new CardRequest(cardName, setCode, artIndex, isFoil, IPaperCard.NO_COLLECTOR_NUMBER); + } catch (NumberFormatException ex){ return null; } + } + public static CardRequest fromString(String reqInfo) { if (reqInfo == null) return null; @@ -179,21 +192,25 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { cardName = cardName.substring(0, cardName.length() - foilSuffix.length()); isFoil = true; } - - String preferredArt = artPrefs.get(cardName); int artIndex = artPos > 0 ? Integer.parseInt(info[artPos]) : IPaperCard.NO_ART_INDEX; // default: no art index - if (preferredArt != null) { //account for preferred art if needed - System.err.println("I AM HERE - DECIDE WHAT TO DO"); - } String collectorNumber = cNrPos > 0 ? info[cNrPos].substring(1, info[cNrPos].length() - 1) : IPaperCard.NO_COLLECTOR_NUMBER; - String setName = setPos > 0 ? info[setPos] : null; - if (setName != null && setName.equals(CardEdition.UNKNOWN.getCode())) { // ??? - setName = null; + String setCode = setPos > 0 ? info[setPos] : null; + if (setCode != null && setCode.equals(CardEdition.UNKNOWN.getCode())) { // ??? + setCode = null; + } + if (setCode == null) { + String preferredArt = artPrefs.get(cardName); + if (preferredArt != null) { //account for preferred art if needed + CardRequest request = fromPreferredArtEntry(preferredArt, isFoil); + if (request != null) // otherwise, simply discard it and go on. + return request; + System.err.println(String.format("[LOG]: Faulty Entry in Preferred Art for Card %s - Please check!", cardName)); + } } // finally, check whether any between artIndex and CollectorNumber has been set if (collectorNumber.equals(IPaperCard.NO_COLLECTOR_NUMBER) && artIndex == IPaperCard.NO_ART_INDEX) artIndex = IPaperCard.DEFAULT_ART_INDEX; - return new CardRequest(cardName, setName, artIndex, isFoil, collectorNumber); + return new CardRequest(cardName, setCode, artIndex, isFoil, collectorNumber); } } @@ -373,11 +390,11 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return pc; } - public boolean setPreferredArt(String cardName, String preferredArt) { - CardRequest request = CardRequest.fromString(cardName + NameSetSeparator + preferredArt); - PaperCard pc = tryGetCard(request); + public boolean setPreferredArt(String cardName, String setCode, int artIndex) { + String cardRequestForPreferredArt = CardRequest.compose(cardName, setCode, artIndex); + PaperCard pc = this.getCard(cardRequestForPreferredArt); if (pc != null) { - artPrefs.put(cardName, preferredArt); + artPrefs.put(cardName, cardRequestForPreferredArt); uniqueCardsByName.put(cardName, pc); return true; } diff --git a/forge-gui-desktop/src/test/java/forge/card/CardDbTestCase.java b/forge-gui-desktop/src/test/java/forge/card/CardDbTestCase.java index e2bd0bdff47..e11464623ae 100644 --- a/forge-gui-desktop/src/test/java/forge/card/CardDbTestCase.java +++ b/forge-gui-desktop/src/test/java/forge/card/CardDbTestCase.java @@ -2085,6 +2085,58 @@ public class CardDbTestCase extends ForgeCardMockTestCase { assertEquals(maxArtIndex, 13); } + @Test void prepareTestCaseForSetPreferredArtTest(){ + String setCode = this.editionsCounterspell[0]; + int artIndex = 4; // non-existing + String cardRequest = CardDb.CardRequest.compose(this.cardNameCounterspell, setCode, artIndex); + PaperCard nonExistingCounterSpell = this.cardDb.getCard(cardRequest); + assertNull(nonExistingCounterSpell); + } + + @Test void setPreferredArtForCard(){ + String cardName = "Mountain"; + String setCode = "3ED"; + int artIndex = 5; + assertFalse(this.cardDb.setPreferredArt(cardName, setCode, artIndex)); + assertTrue(this.cardDb.setPreferredArt(cardName, setCode, 1)); + } + + + @Test void testThatWithCardPreferenceSetAndNoRequestForSpecificEditionAlwaysReturnsPreferredArt(){ + String cardRequest = CardDb.CardRequest.compose("Island", "MIR", 3); + PaperCard islandCard = this.cardDb.getCard(cardRequest); + assertNotNull(islandCard); + assertEquals(islandCard.getName(), "Island"); + assertEquals(islandCard.getEdition(), "MIR"); + assertEquals(islandCard.getArtIndex(), 3); + + // now set preferred art + assertTrue(this.cardDb.setPreferredArt("Island", "MIR", 3)); + // Now requesting for a different Island + cardRequest = CardDb.CardRequest.compose("Island", "TMP", 1); + islandCard = this.cardDb.getCard(cardRequest); + assertNotNull(islandCard); + // Now card should be from the preferred art no matter the request + assertEquals(islandCard.getName(), "Island"); + assertEquals(islandCard.getEdition(), "TMP"); + assertEquals(islandCard.getArtIndex(), 1); + + // Now just asking for an Island + islandCard = this.cardDb.getCard("Island"); + assertNotNull(islandCard); + assertEquals(islandCard.getName(), "Island"); + assertEquals(islandCard.getEdition(), "MIR"); + assertEquals(islandCard.getArtIndex(), 3); + + // Now asking for a foiled island - I will get the one from preferred art - but foiled + cardRequest = CardDb.CardRequest.compose("Island", true); + islandCard = this.cardDb.getCard(cardRequest); + assertNotNull(islandCard); + assertEquals(islandCard.getName(), "Island"); + assertEquals(islandCard.getEdition(), "MIR"); + assertEquals(islandCard.getArtIndex(), 3); + assertTrue(islandCard.isFoil()); + } } diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index e6c671f068a..d3590ddbe96 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -1281,7 +1281,7 @@ public class FDeckEditor extends TabPageScreen { if (result != card) { cardManager.replaceAll(card, result); } - prefs.setPreferredArt(result.getEdition() + CardDb.NameSetSeparator + result.getArtIndex()); + prefs.setPreferredArt(result.getEdition(), result.getArtIndex()); CardPreferences.save(); } } diff --git a/forge-gui/src/main/java/forge/gui/card/CardPreferences.java b/forge-gui/src/main/java/forge/gui/card/CardPreferences.java index 664166cfb44..fa9c8df0442 100644 --- a/forge-gui/src/main/java/forge/gui/card/CardPreferences.java +++ b/forge-gui/src/main/java/forge/gui/card/CardPreferences.java @@ -8,6 +8,8 @@ import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import forge.card.CardDb; +import forge.util.TextUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; @@ -113,8 +115,31 @@ public class CardPreferences { } if (preferredArt0.equals(preferredArt)) { return; } - if (FModel.getMagicDb().getCommonCards().setPreferredArt(cardName, preferredArt0)) { - preferredArt = preferredArt0; + try { + String infoCardName; + String infoSetCode; + int infoArtIndex; + String[] prefArtInfos =TextUtil.split(preferredArt0, CardDb.NameSetSeparator); + if (prefArtInfos.length == 2){ + // legacy format + infoCardName = this.cardName; + infoSetCode = prefArtInfos[0]; + infoArtIndex = Integer.parseInt(prefArtInfos[1]); + } else { + infoCardName = prefArtInfos[0]; + infoSetCode = prefArtInfos[1]; + infoArtIndex = Integer.parseInt(prefArtInfos[2]); + } + if (!this.cardName.equals(infoCardName)) // extra sanity check + return; + if (FModel.getMagicDb().getCommonCards().setPreferredArt(cardName, infoSetCode, infoArtIndex)) + preferredArt = preferredArt0; + } catch (NumberFormatException ex){ + System.err.println("ERROR with Existing Preferred Card Entry: " + preferredArt0); } } + + public void setPreferredArt(String setCode, int artIndex) { + this.setPreferredArt(setCode + CardDb.NameSetSeparator + artIndex); + } } \ No newline at end of file