diff --git a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java index 0008f954459..c5a4aa15756 100644 --- a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java +++ b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java @@ -291,7 +291,7 @@ public final class DeckGenerator { for (ColoredManaSymbol c : ColoredManaSymbol.values()) { String landName = DeckGeneratorPool.getBasicLandName(c.toString()); - criteria.rarities(Rarity.LAND).nameExact(landName); + criteria.rarities(Rarity.LAND).name(landName); List cards = CardRepository.instance.findCards(criteria); if (cards.isEmpty()) { // Workaround to get basic lands if lands are not available for the given sets criteria.setCodes("M15"); diff --git a/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java b/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java index 8bfbc9ccfdd..217ffec97b2 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java @@ -154,9 +154,11 @@ public class AddLandDialog extends MageDialog { criteria.ignoreSetsWithSnowLands(); } if (mode == DeckEditorMode.FREE_BUILDING && expansionInfo != null && CardRepository.haveSnowLands(expansionInfo.getCode())) { - criteria.name(landName); // snow basics added only if in free mode and the chosen set has exclusively snow basics + // snow basics added only if in free mode and the chosen set has exclusively snow basics + // use contains to find snow lands too + criteria.nameContains(landName); } else { - criteria.nameExact(landName); + criteria.name(landName); } criteria.rarities(Rarity.LAND); List cards = CardRepository.instance.findCards(criteria); diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java index 65d87a18ede..dab1c75fe6d 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java @@ -577,7 +577,7 @@ public enum WizardCardsImageSource implements CardImageSource { private void getLandVariations(LinkedHashMap setLinks, String cardSet, int multiverseId, String cardName) throws IOException, NumberFormatException { CardCriteria criteria = new CardCriteria(); - criteria.nameExact(cardName); + criteria.name(cardName); criteria.setCodes(cardSet); List cards = CardRepository.instance.findCards(criteria); diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index 00fa7530486..dc90154a742 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -2222,7 +2222,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { if (!landSets.isEmpty()) { criteria.setCodes(landSets.toArray(new String[landSets.size()])); } - criteria.rarities(Rarity.LAND).nameExact(landName); + criteria.rarities(Rarity.LAND).name(landName); List cards = CardRepository.instance.findCards(criteria); if (cards.isEmpty()) { diff --git a/Mage.Server/src/main/java/mage/server/util/SystemUtil.java b/Mage.Server/src/main/java/mage/server/util/SystemUtil.java index 3eb7ce464a5..f5006e22352 100644 --- a/Mage.Server/src/main/java/mage/server/util/SystemUtil.java +++ b/Mage.Server/src/main/java/mage/server/util/SystemUtil.java @@ -8,6 +8,7 @@ import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.Effect; import mage.abilities.effects.common.InfoEffect; import mage.cards.Card; +import mage.cards.decks.importer.CardLookup; import mage.cards.repository.CardCriteria; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; @@ -528,7 +529,7 @@ public final class SystemUtil { // simple cast (without targets or modes) // find card info - CardInfo cardInfo = CardRepository.instance.findCard(command.cardName); + CardInfo cardInfo = CardLookup.instance.lookupCardInfo(command.cardName, command.cardSet).orElse(null); if (cardInfo == null) { logger.warn("Unknown card for stack command [" + command.cardName + "]: " + line); continue; @@ -579,7 +580,7 @@ public final class SystemUtil { continue; } - List cards = null; + List cards; if (command.cardSet.isEmpty()) { // by name cards = CardRepository.instance.findCards(command.cardName); @@ -589,7 +590,11 @@ public final class SystemUtil { } if (cards.isEmpty()) { - logger.warn("Unknown card [" + command.cardName + "]: " + line); + logger.warn(String.format("Unknown card [%s%s]: %s", + command.cardSet.isEmpty() ? "" : command.cardSet + "-", + command.cardName, + line + )); continue; } diff --git a/Mage.Sets/src/mage/sets/EldritchMoon.java b/Mage.Sets/src/mage/sets/EldritchMoon.java index f52abdcc3e0..5b9e2d9967f 100644 --- a/Mage.Sets/src/mage/sets/EldritchMoon.java +++ b/Mage.Sets/src/mage/sets/EldritchMoon.java @@ -314,7 +314,7 @@ public final class EldritchMoon extends ExpansionSet { for (String name : meldCardNames) { cardInfos.addAll(CardRepository.instance.findCards(new CardCriteria() .setCodes(this.code) - .nameExact(name))); + .name(name))); } return cardInfos; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/ConjureCardEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ConjureCardEffect.java index 60ad936be12..0d71d1b4fe0 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ConjureCardEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ConjureCardEffect.java @@ -56,7 +56,7 @@ public class ConjureCardEffect extends OneShotEffect { } CardInfo cardInfo = CardRepository .instance - .findCards(new CardCriteria().nameExact(cardName)) + .findCards(new CardCriteria().name(cardName)) .stream() .findFirst() .orElse(null); diff --git a/Mage/src/main/java/mage/abilities/effects/common/DraftFromSpellbookEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DraftFromSpellbookEffect.java index fdc4a0d286d..cc658c87f4c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DraftFromSpellbookEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DraftFromSpellbookEffect.java @@ -62,7 +62,7 @@ public class DraftFromSpellbookEffect extends OneShotEffect { } CardInfo cardInfo = CardRepository .instance - .findCards(new CardCriteria().nameExact(cardName)) + .findCards(new CardCriteria().name(cardName)) .stream() .findFirst() .orElse(null); diff --git a/Mage/src/main/java/mage/cards/decks/importer/CardLookup.java b/Mage/src/main/java/mage/cards/decks/importer/CardLookup.java index 05e24ac08a1..b788cb88704 100644 --- a/Mage/src/main/java/mage/cards/decks/importer/CardLookup.java +++ b/Mage/src/main/java/mage/cards/decks/importer/CardLookup.java @@ -1,12 +1,12 @@ package mage.cards.decks.importer; -import java.util.List; -import java.util.Optional; - import mage.cards.repository.CardCriteria; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; +import java.util.List; +import java.util.Optional; + public class CardLookup { public static final CardLookup instance = new CardLookup(); diff --git a/Mage/src/main/java/mage/cards/decks/importer/DraftLogImporter.java b/Mage/src/main/java/mage/cards/decks/importer/DraftLogImporter.java index dbd0220f093..13906503567 100644 --- a/Mage/src/main/java/mage/cards/decks/importer/DraftLogImporter.java +++ b/Mage/src/main/java/mage/cards/decks/importer/DraftLogImporter.java @@ -2,10 +2,8 @@ package mage.cards.decks.importer; import mage.cards.decks.DeckCardInfo; import mage.cards.decks.DeckCardLists; -import mage.cards.repository.CardCriteria; import mage.cards.repository.CardInfo; -import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -28,14 +26,7 @@ public class DraftLogImporter extends PlainTextDeckImporter { Matcher pickMatcher = PICK_PATTERN.matcher(line); if (pickMatcher.matches()) { String name = pickMatcher.group(1); - List cards = getCardLookup().lookupCardInfo(new CardCriteria().setCodes(currentSet).name(name)); - CardInfo card = null; - if (!cards.isEmpty()) { - card = cards.get(0); - } else { - card = getCardLookup().lookupCardInfo(name).orElse(null); - } - + CardInfo card = getCardLookup().lookupCardInfo(name, currentSet).orElse(null); if (card != null) { deckList.getCards().add(new DeckCardInfo(card.getName(), card.getCardNumber(), card.getSetCode())); } else { diff --git a/Mage/src/main/java/mage/cards/decks/importer/MWSDeckImporter.java b/Mage/src/main/java/mage/cards/decks/importer/MWSDeckImporter.java index 9d34750afbe..b1e9e522551 100644 --- a/Mage/src/main/java/mage/cards/decks/importer/MWSDeckImporter.java +++ b/Mage/src/main/java/mage/cards/decks/importer/MWSDeckImporter.java @@ -2,11 +2,7 @@ package mage.cards.decks.importer; import mage.cards.decks.DeckCardInfo; import mage.cards.decks.DeckCardLists; -import mage.cards.repository.CardCriteria; import mage.cards.repository.CardInfo; -import mage.util.RandomUtil; - -import java.util.List; /** * @author BetaSteward_at_googlemail.com @@ -37,16 +33,9 @@ public class MWSDeckImporter extends PlainTextDeckImporter { try { int num = Integer.parseInt(lineNum); CardInfo cardInfo = null; - if (!setCode.isEmpty()) { - CardCriteria criteria = new CardCriteria(); - criteria.name(lineName); - criteria.setCodes(setCode); - List cards = getCardLookup().lookupCardInfo(criteria); - if (!cards.isEmpty()) { - cardInfo = cards.get(RandomUtil.nextInt(cards.size())); - } - } - if (cardInfo == null) { + if (setCode.isEmpty()) { + cardInfo = getCardLookup().lookupCardInfo(lineName, setCode).orElse(null); + } else { cardInfo = getCardLookup().lookupCardInfo(lineName).orElse(null); } diff --git a/Mage/src/main/java/mage/cards/repository/CardCriteria.java b/Mage/src/main/java/mage/cards/repository/CardCriteria.java index ebc54e6f2d9..d390b7898fd 100644 --- a/Mage/src/main/java/mage/cards/repository/CardCriteria.java +++ b/Mage/src/main/java/mage/cards/repository/CardCriteria.java @@ -18,8 +18,8 @@ import java.util.List; */ public class CardCriteria { + private String nameContains; private String name; - private String nameExact; private String rules; private final List setCodes; private final List ignoreSetCodes; // sets to ignore, use with little amount of sets (example: ignore sets with snow lands) @@ -119,13 +119,13 @@ public class CardCriteria { return this; } - public CardCriteria name(String name) { - this.name = name; + public CardCriteria nameContains(String str) { + this.nameContains = str; return this; } - public CardCriteria nameExact(String nameExact) { - this.nameExact = nameExact; + public CardCriteria name(String name) { + this.name = name; return this; } @@ -220,12 +220,12 @@ public class CardCriteria { where.eq("nightCard", nightCard); where.eq("splitCardHalf", false); int clausesCount = 2; - if (name != null) { - where.like("name", new SelectArg('%' + name + '%')); + if (nameContains != null) { + where.like("name", new SelectArg('%' + nameContains + '%')); clausesCount++; } - if (nameExact != null) { - where.like("name", new SelectArg(nameExact)); + if (name != null) { + where.eq("name", new SelectArg(name)); clausesCount++; } if (rules != null) { @@ -397,12 +397,12 @@ public class CardCriteria { return this; } - public String getName() { - return name; + public String getNameContains() { + return nameContains; } - public String getNameExact() { - return nameExact; + public String getName() { + return name; } public String getRules() { diff --git a/Mage/src/main/java/mage/util/TournamentUtil.java b/Mage/src/main/java/mage/util/TournamentUtil.java index b3de75912be..3df492aad2c 100644 --- a/Mage/src/main/java/mage/util/TournamentUtil.java +++ b/Mage/src/main/java/mage/util/TournamentUtil.java @@ -68,7 +68,7 @@ public final class TournamentUtil { } else { criteria.ignoreSetsWithSnowLands(); } - criteria.rarities(Rarity.LAND).nameExact(landName); + criteria.rarities(Rarity.LAND).name(landName); List lands = CardRepository.instance.findCards(criteria); List cards = new ArrayList<>(); if (!lands.isEmpty()) {