mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-09-23 01:55:10 -07:00
[Card] Import Scryfall Tagger tags from MTGJson
This commit is contained in:
parent
7a2492ac67
commit
1803fce56c
3 changed files with 85 additions and 0 deletions
|
|
@ -28,6 +28,7 @@ QString const PowTough("pt");
|
||||||
QString const Side("side");
|
QString const Side("side");
|
||||||
QString const Layout("layout");
|
QString const Layout("layout");
|
||||||
QString const ColorIdentity("coloridentity");
|
QString const ColorIdentity("coloridentity");
|
||||||
|
QString const Tags("tags");
|
||||||
|
|
||||||
inline static const QString getNicePropertyName(QString key)
|
inline static const QString getNicePropertyName(QString key)
|
||||||
{
|
{
|
||||||
|
|
@ -61,6 +62,9 @@ inline static const QString getNicePropertyName(QString key)
|
||||||
if (key == ColorIdentity) {
|
if (key == ColorIdentity) {
|
||||||
return QCoreApplication::translate("Mtg", "Color Identity");
|
return QCoreApplication::translate("Mtg", "Color Identity");
|
||||||
}
|
}
|
||||||
|
if (key == Tags) {
|
||||||
|
return QCoreApplication::translate("Mtg", "Tags");
|
||||||
|
}
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
} // namespace Mtg
|
} // namespace Mtg
|
||||||
|
|
|
||||||
|
|
@ -505,6 +505,21 @@ int OracleImporter::importCardsFromSet(const CardSetPtr ¤tSet, const QJson
|
||||||
properties.insert("coloridentity", colorIdentity);
|
properties.insert("coloridentity", colorIdentity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Scryfall Tagger tags (resolved by MTGJSON into the `tags` array).
|
||||||
|
// Stored space-separated so the `tags:` search can match each slug as a
|
||||||
|
// discrete token; slugs never contain whitespace.
|
||||||
|
QStringList tags;
|
||||||
|
for (const QJsonValue &tag : card.value("tags").toArray()) {
|
||||||
|
const QString tagSlug = tag.toString().trimmed().toLower();
|
||||||
|
if (!tagSlug.isEmpty() && !tags.contains(tagSlug)) {
|
||||||
|
tags.append(tagSlug);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!tags.isEmpty()) {
|
||||||
|
tags.sort();
|
||||||
|
properties.insert("tags", tags.join(" "));
|
||||||
|
}
|
||||||
|
|
||||||
const auto &mainCardType = getMainCardType(card.value("types").toVariant().toStringList());
|
const auto &mainCardType = getMainCardType(card.value("types").toVariant().toStringList());
|
||||||
if (mainCardType.isEmpty()) {
|
if (mainCardType.isEmpty()) {
|
||||||
qDebug() << "warning: no mainCardType for card:" << name;
|
qDebug() << "warning: no mainCardType for card:" << name;
|
||||||
|
|
@ -651,6 +666,14 @@ int OracleImporter::importCardsFromSet(const CardSetPtr ¤tSet, const QJson
|
||||||
if (newPriority >= 0 && (currentPriority < 0 || newPriority < currentPriority)) {
|
if (newPriority >= 0 && (currentPriority < 0 || newPriority < currentPriority)) {
|
||||||
properties.insert(prop, thisCardPropertyValue);
|
properties.insert(prop, thisCardPropertyValue);
|
||||||
}
|
}
|
||||||
|
} else if (prop == "tags") {
|
||||||
|
// Tags are oracle-level: union both faces instead of
|
||||||
|
// concatenating them with the split-card separator.
|
||||||
|
QStringList merged =
|
||||||
|
(originalPropertyValue + " " + thisCardPropertyValue).split(" ", Qt::SkipEmptyParts);
|
||||||
|
merged.removeDuplicates();
|
||||||
|
merged.sort();
|
||||||
|
properties.insert(prop, merged.join(" "));
|
||||||
} else {
|
} else {
|
||||||
properties.insert(prop,
|
properties.insert(prop,
|
||||||
originalPropertyValue + splitCardPropSeparator + thisCardPropertyValue);
|
originalPropertyValue + splitCardPropSeparator + thisCardPropertyValue);
|
||||||
|
|
|
||||||
|
|
@ -523,6 +523,64 @@ TEST_F(OracleImporterTest, LegacyConvertedManaCostCoercedToCmc)
|
||||||
ASSERT_EQ(result->getProperty("cmc"), "3");
|
ASSERT_EQ(result->getProperty("cmc"), "3");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// Scryfall Tagger tag tests
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
TEST_F(OracleImporterTest, ImportsScryfallTags)
|
||||||
|
{
|
||||||
|
QJsonObject card = makeCard("Ramp Card");
|
||||||
|
card["tags"] = QJsonArray{"ramp", "removal"};
|
||||||
|
QJsonArray cards{card};
|
||||||
|
|
||||||
|
importer->importCardsFromSet(set, cards);
|
||||||
|
auto result = importer->getCardList().value("Ramp Card");
|
||||||
|
ASSERT_FALSE(result.isNull());
|
||||||
|
ASSERT_EQ(result->getProperty("tags"), "ramp removal");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(OracleImporterTest, TagsAreNormalizedDedupedAndSorted)
|
||||||
|
{
|
||||||
|
QJsonObject card = makeCard("Messy Tags");
|
||||||
|
card["tags"] = QJsonArray{"Ramp", " removal ", "ramp", ""};
|
||||||
|
QJsonArray cards{card};
|
||||||
|
|
||||||
|
importer->importCardsFromSet(set, cards);
|
||||||
|
auto result = importer->getCardList().value("Messy Tags");
|
||||||
|
ASSERT_FALSE(result.isNull());
|
||||||
|
ASSERT_EQ(result->getProperty("tags"), "ramp removal");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(OracleImporterTest, CardsWithoutTagsHaveNoTagsProperty)
|
||||||
|
{
|
||||||
|
QJsonArray cards{makeCard("Untagged Card")};
|
||||||
|
importer->importCardsFromSet(set, cards);
|
||||||
|
|
||||||
|
auto result = importer->getCardList().value("Untagged Card");
|
||||||
|
ASSERT_FALSE(result.isNull());
|
||||||
|
ASSERT_FALSE(result->hasProperty("tags"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(OracleImporterTest, SplitCardTagsAreUnioned)
|
||||||
|
{
|
||||||
|
QJsonObject face1 = makeCard("Fire // Ice");
|
||||||
|
face1["layout"] = "split";
|
||||||
|
face1["side"] = "a";
|
||||||
|
face1["faceName"] = "Fire";
|
||||||
|
face1["tags"] = QJsonArray{"removal"};
|
||||||
|
QJsonObject face2 = makeCard("Fire // Ice");
|
||||||
|
face2["layout"] = "split";
|
||||||
|
face2["side"] = "b";
|
||||||
|
face2["faceName"] = "Ice";
|
||||||
|
face2["tags"] = QJsonArray{"card-advantage", "removal"};
|
||||||
|
QJsonArray cards{face1, face2};
|
||||||
|
|
||||||
|
importer->importCardsFromSet(set, cards);
|
||||||
|
auto result = importer->getCardList().value("Fire // Ice");
|
||||||
|
ASSERT_FALSE(result.isNull());
|
||||||
|
ASSERT_EQ(result->getProperty("tags"), "card-advantage removal");
|
||||||
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// Card deduplication tests
|
// Card deduplication tests
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue