From 87439388db04b36b6a46bb6046d912f9c6c7dd0e Mon Sep 17 00:00:00 2001 From: leriomaggio Date: Wed, 20 Oct 2021 10:47:44 +0200 Subject: [PATCH] Improved support for Unknown cards in DeckImport DeckImport now avoids including non-deck and metadata info in decklist as UnknownText, whilst any line that looks like a card request (i.e. includes a card quantity in the beginning) is interpreted as Unknown card. This seems a good compromise with showing typo and any mispelling in card list whilst avoiding flooding decklist with unnecessary info. --- .../main/java/forge/deck/DeckRecognizer.java | 17 ++++-- .../forge/screens/deckeditor/DeckImport.java | 14 +++-- .../java/forge/deck/DeckRecognizerTest.java | 57 ++++++++++++++++++- forge-gui/res/languages/de-DE.properties | 1 - forge-gui/res/languages/en-US.properties | 1 - forge-gui/res/languages/es-ES.properties | 1 - forge-gui/res/languages/it-IT.properties | 1 - forge-gui/res/languages/ja-JP.properties | 1 - forge-gui/res/languages/zh-CN.properties | 1 - 9 files changed, 75 insertions(+), 19 deletions(-) diff --git a/forge-core/src/main/java/forge/deck/DeckRecognizer.java b/forge-core/src/main/java/forge/deck/DeckRecognizer.java index 1fc10f8abf9..6fcfb1358a7 100644 --- a/forge-core/src/main/java/forge/deck/DeckRecognizer.java +++ b/forge-core/src/main/java/forge/deck/DeckRecognizer.java @@ -584,7 +584,7 @@ public class DeckRecognizer { public Token recogniseCardToken(final String text, final DeckSection currentDeckSection) { String line = text.trim(); - Token uknonwnCardToken = null; + Token unknownCardToken = null; StaticData data = StaticData.instance(); List cardMatchers = getRegExMatchers(line); for (Matcher matcher : cardMatchers) { @@ -596,10 +596,7 @@ public class DeckRecognizer { if (!data.isMTGCard(cardName)){ // check the case for double-sided cards cardName = checkDoubleSidedCard(cardName); - if (cardName == null) - continue; } - String ccount = getRexGroup(matcher, REGRP_CARDNO); String setCode = getRexGroup(matcher, REGRP_SET); String collNo = getRexGroup(matcher, REGRP_COLLNR); @@ -607,6 +604,14 @@ public class DeckRecognizer { String deckSecFromCardLine = getRexGroup(matcher, REGRP_DECK_SEC_XMAGE_STYLE); boolean isFoil = foilGr != null; int cardCount = ccount != null ? Integer.parseInt(ccount) : 1; + + if (cardName == null){ + if (ccount != null) + // setting cardCount to zero as the text is the whole line + unknownCardToken = Token.UnknownCard(text, null, 0); + continue; + } + // if any, it will be tried to convert specific collector number to art index (useful for lands). String collectorNumber = collNo != null ? collNo : IPaperCard.NO_COLLECTOR_NUMBER; int artIndex; @@ -620,7 +625,7 @@ public class DeckRecognizer { CardEdition edition = StaticData.instance().getEditions().get(setCode); if (edition == null) { // set the case for unknown card (in case) and continue to the next for any better matching - uknonwnCardToken = Token.UnknownCard(cardName, setCode, cardCount); + unknownCardToken = Token.UnknownCard(cardName, setCode, cardCount); continue; } @@ -652,7 +657,7 @@ public class DeckRecognizer { return checkAndSetCardToken(pc, edition, cardCount, deckSecFromCardLine, currentDeckSection); } } - return uknonwnCardToken; // either null or unknown card + return unknownCardToken; // either null or unknown card } private String checkDoubleSidedCard(final String cardName){ diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java index c34a52f4c81..b9d7a251945 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java @@ -758,7 +758,8 @@ public class DeckImport extends FDialog { // Card Warning Msgs case UNKNOWN_CARD: case UNSUPPORTED_CARD: - return String.format("%s x %s", token.getQuantity(), token.getText()); + return token.getQuantity() > 0 ? String.format("%s x %s", token.getQuantity(), token.getText()) + : token.getText(); case UNSUPPORTED_DECK_SECTION: return String.format("%s: %s", Localizer.getInstance().getMessage("lblWarningMsgPrefix"), @@ -784,12 +785,13 @@ public class DeckImport extends FDialog { case CARD_CMC: case MANA_COLOUR: case COMMENT: - case UNKNOWN_TEXT: return token.getText(); case DECK_NAME: return String.format("%s: %s", Localizer.getInstance().getMessage("lblDeckName"), token.getText()); + + case UNKNOWN_TEXT: default: return null; @@ -815,8 +817,6 @@ public class DeckImport extends FDialog { case UNSUPPORTED_CARD: return Localizer.getInstance().getMessage("lblErrUnsupportedCard", this.currentGameType); - case UNKNOWN_TEXT: - return Localizer.getInstance().getMessage("lblWarnUnknownTxtMsg"); case UNKNOWN_CARD: return String.format("%s: %s", Localizer.getInstance().getMessage("lblWarningMsgPrefix"), Localizer.getInstance().getMessage("lblWarnUnknownCardMsg")); @@ -831,6 +831,7 @@ public class DeckImport extends FDialog { case CARD_RARITY: case DECK_NAME: case LEGAL_CARD: + case UNKNOWN_TEXT: default: return null; @@ -848,10 +849,10 @@ public class DeckImport extends FDialog { case CARD_FROM_INVALID_SET: case UNSUPPORTED_CARD: return KO_NOIMPORT_CLASS; - case UNKNOWN_CARD: case UNSUPPORTED_DECK_SECTION: case WARNING_MESSAGE: - case UNKNOWN_TEXT: + case UNKNOWN_CARD: + return WARN_MSG_CLASS; case COMMENT: return COMMENT_CLASS; case DECK_NAME: @@ -865,6 +866,7 @@ public class DeckImport extends FDialog { case CARD_CMC: case MANA_COLOUR: return CMC_CLASS; + case UNKNOWN_TEXT: default: return ""; } diff --git a/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java b/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java index 0d4634ac6eb..bbe484c8aee 100644 --- a/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java +++ b/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java @@ -2486,9 +2486,64 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase { } /*================================= - * TEST BANNED + * TEST UNKNOWN CARDS * ================================ */ + @Test void testUknonwCardIsReturnedForAnExistingCardFromTheWrongSet(){ + String cardRequest = "Counterspell FEM"; + DeckRecognizer recognizer = new DeckRecognizer(); + Token unknonwCardToken = recognizer.recogniseCardToken(cardRequest, null); + assertNotNull(unknonwCardToken); + assertEquals(unknonwCardToken.getType(), TokenType.UNKNOWN_CARD); + assertNull(unknonwCardToken.getCard()); + assertNull(unknonwCardToken.getTokenSection()); + } + + @Test void testUknownCardIsReturnedForLineRequestsThatLooksLikeACardButAreNotSupported(){ + String cardRequest = "2x Counterspelling TMP"; + DeckRecognizer recognizer = new DeckRecognizer(); + Token unknonwCardToken = recognizer.recogniseCardToken(cardRequest, null); + assertNotNull(unknonwCardToken); + assertEquals(unknonwCardToken.getType(), TokenType.UNKNOWN_CARD); + assertNull(unknonwCardToken.getCard()); + assertNull(unknonwCardToken.getTokenSection()); + + cardRequest = "2x Counterspelling"; + unknonwCardToken = recognizer.recogniseCardToken(cardRequest, null); + assertNotNull(unknonwCardToken); + assertEquals(unknonwCardToken.getType(), TokenType.UNKNOWN_CARD); + assertNull(unknonwCardToken.getCard()); + assertNull(unknonwCardToken.getTokenSection()); + + cardRequest = "2x Counterspell FEM "; + unknonwCardToken = recognizer.recogniseCardToken(cardRequest, null); + assertNotNull(unknonwCardToken); + assertEquals(unknonwCardToken.getType(), TokenType.UNKNOWN_CARD); + assertNull(unknonwCardToken.getCard()); + assertNull(unknonwCardToken.getTokenSection()); + + cardRequest = "SB: 2x Counterspelling TMP"; // adding deck section reference + unknonwCardToken = recognizer.recogniseCardToken(cardRequest, null); + assertNotNull(unknonwCardToken); + assertEquals(unknonwCardToken.getType(), TokenType.UNKNOWN_CARD); + assertNull(unknonwCardToken.getCard()); + assertNull(unknonwCardToken.getTokenSection()); + + cardRequest = "SB: 2x Counterspelling TMP (F)"; // adding deck section reference + unknonwCardToken = recognizer.recogniseCardToken(cardRequest, null); + assertNotNull(unknonwCardToken); + assertEquals(unknonwCardToken.getType(), TokenType.UNKNOWN_CARD); + assertNull(unknonwCardToken.getCard()); + assertNull(unknonwCardToken.getTokenSection()); + + cardRequest = "SB: 2x Counterspelling+ TMP"; // adding deck section reference + unknonwCardToken = recognizer.recogniseCardToken(cardRequest, null); + assertNotNull(unknonwCardToken); + assertEquals(unknonwCardToken.getType(), TokenType.UNKNOWN_CARD); + assertNull(unknonwCardToken.getCard()); + assertNull(unknonwCardToken.getTokenSection()); + } + /*=============== * TEST TOKEN-KEY * ============== */ diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 422e2c22afc..f492477b6c9 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -2658,7 +2658,6 @@ lblWarnLimitedCard={0} in {1} lblErrCardEditionDate=Set not compliant with Release Date option lblErrUnsupportedCard=Not allowed in {0} lblWarnUnknownCardMsg=Unknown Card or Unsupported in Forge -lblWarnUnknownTxtMsg=Unrecognized or Unsupported Card or Placeholder lblWarnTooManyCommanders=Current {0} Section contains {1} potential Commander Cards: {2} lblWarnCommandersInSideExtra=Please check and move one to the Commander Section, in case. lblWarnDeckSectionNotAllowedInEditor={0} Section is not allowed in {1} diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 18b74268c7c..0a0a028a233 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -2656,7 +2656,6 @@ lblWarnLimitedCard={0} in {1} lblErrCardEditionDate=Set not compliant with Release Date option lblErrUnsupportedCard=Not allowed in {0} lblWarnUnknownCardMsg=Unknown Card or Unsupported in Forge -lblWarnUnknownTxtMsg=Unrecognized or Unsupported Card or Placeholder lblWarnTooManyCommanders=Current {0} Section contains {1} potential Commander Cards: {2} lblWarnCommandersInSideExtra=Please check and move one to the Commander Section, in case. lblWarnDeckSectionNotAllowedInEditor={0} Section is not allowed in {1} diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index ca7f719b5b4..991f2b8aded 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -2656,7 +2656,6 @@ lblWarnLimitedCard={0} in {1} lblErrCardEditionDate=Set not compliant with Release Date option lblErrUnsupportedCard=Not allowed in {0} lblWarnUnknownCardMsg=Unknown Card or Unsupported in Forge -lblWarnUnknownTxtMsg=Unrecognized or Unsupported Card or Placeholder lblWarnTooManyCommanders=Current {0} Section contains {1} potential Commander Cards: {2} lblWarnCommandersInSideExtra=Please check and move one to the Commander Section, in case. lblWarnDeckSectionNotAllowedInEditor={0} Section is not allowed in {1} diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index f71e1107040..021eec01988 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -2656,7 +2656,6 @@ lblWarnLimitedCard={0} in {1} lblErrCardEditionDate=Edizione non valida secondo l'opzione sulla data di pubblicazione selezionata lblErrUnsupportedCard=Non Permesso in {0} lblWarnUnknownCardMsg=Carta Sconosciuta, o non supportata in Forge -lblWarnUnknownTxtMsg=Carda o Segnaposto non riconosciuto o non supportato lblWarnTooManyCommanders=La Sezione {0} contiene {1} potenziali carte Commander: {2} lblWarnCommandersInSideExtra=Per favore, controlla e nel caso spostane una nella sezione Commander. lblWarnDeckSectionNotAllowedInEditor={0} Sezione non รจ permessa in {1} diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index be3cab816a7..1336ab6211e 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -2655,7 +2655,6 @@ lblWarnLimitedCard={0} in {1} lblErrCardEditionDate=Set not compliant with Release Date option lblErrUnsupportedCard=Not allowed in {0} lblWarnUnknownCardMsg=Unknown Card or Unsupported in Forge -lblWarnUnknownTxtMsg=Unrecognized or Unsupported Card or Placeholder lblWarnTooManyCommanders=Current {0} Section contains {1} potential Commander Cards: {2} lblWarnCommandersInSideExtra=Please check and move one to the Commander Section, in case. lblWarnDeckSectionNotAllowedInEditor={0} Section is not allowed in {1} diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index cdb99f0a4c1..ef388df6229 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -2657,7 +2657,6 @@ lblWarnLimitedCard={0} in {1} lblErrCardEditionDate=Set not compliant with Release Date option lblErrUnsupportedCard=Not allowed in {0} lblWarnUnknownCardMsg=Unknown Card or Unsupported in Forge -lblWarnUnknownTxtMsg=Unrecognized or Unsupported Card or Placeholder lblWarnTooManyCommanders=Current {0} Section contains {1} potential Commander Cards: {2} lblWarnCommandersInSideExtra=Please check and move one to the Commander Section, in case. lblWarnDeckSectionNotAllowedInEditor={0} Section is not allowed in {1}