From 28ec1a7186f0a9a38af8aa1c4022c5ce430e5cec Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Sun, 29 Mar 2015 18:55:15 +0200 Subject: [PATCH] Fix #633 Requires #889 --- oracle/src/oracleimporter.cpp | 51 ++++++++++++++++++++++------------- oracle/src/oracleimporter.h | 4 ++- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/oracle/src/oracleimporter.cpp b/oracle/src/oracleimporter.cpp index d3246694..5f591b4f 100644 --- a/oracle/src/oracleimporter.cpp +++ b/oracle/src/oracleimporter.cpp @@ -69,7 +69,8 @@ CardInfo *OracleImporter::addCard(const QString &setName, const QString &cardType, const QString &cardPT, int cardLoyalty, - const QString &cardText) + const QString &cardText, + const QStringList & colors) { QStringList cardTextRows = cardText.split("\n"); bool splitCard = false; @@ -99,23 +100,6 @@ CardInfo *OracleImporter::addCard(const QString &setName, if (cardTextRows[i].contains("{T}") && cardTextRows[i].contains("to your mana pool")) mArtifact = true; - QStringList colors; - QStringList allColors = QStringList() << "W" << "U" << "B" << "R" << "G"; - for (int i = 0; i < allColors.size(); i++) - if (cardCost.contains(allColors[i])) - colors << allColors[i]; - - if (cardTextRows.contains(cardName + " is white.")) - colors << "W"; - if (cardTextRows.contains(cardName + " is blue.")) - colors << "U"; - if (cardTextRows.contains(cardName + " is black.")) - colors << "B"; - if (cardTextRows.contains(cardName + " is red.")) - colors << "R"; - if (cardTextRows.contains(cardName + " is green.")) - colors << "G"; - bool cipt = cardText.contains(cardName + " enters the battlefield tapped") && !cardText.contains(cardName + " enters the battlefield tapped unless"); @@ -137,6 +121,25 @@ CardInfo *OracleImporter::addCard(const QString &setName, return card; } +void OracleImporter::extractColors(const QStringList & in, QStringList & out) +{ + foreach(QString c, in) + { + if (c == "White") + out << "W"; + else if (c == "Blue") + out << "U"; + else if (c == "Black") + out << "B"; + else if (c == "Red") + out << "R"; + else if (c == "Green") + out << "G"; + else + qDebug() << "error: unknown color:" << c; + } +} + int OracleImporter::importTextSpoiler(CardSet *set, const QVariant &data) { int cards = 0; @@ -149,6 +152,7 @@ int OracleImporter::importTextSpoiler(CardSet *set, const QVariant &data) QString cardType; QString cardPT; QString cardText; + QStringList colors; int cardId; int cardLoyalty; bool cardIsToken = false; @@ -200,6 +204,12 @@ int OracleImporter::importTextSpoiler(CardSet *set, const QVariant &data) cardType += card2->contains("type") ? QString(" // ") + card2->value("type").toString() : QString(""); cardPT += card2->contains("power") || card2->contains("toughness") ? QString(" // ") + card2->value("power").toString() + QString('/') + card2->value("toughness").toString() : QString(""); cardText += card2->contains("text") ? QString("\n\n---\n\n") + card2->value("text").toString() : QString(""); + + colors.clear(); + extractColors(card1->value("colors").toStringList(), colors); + extractColors(card2->value("colors").toStringList(), colors); + colors.removeDuplicates(); + } else { // first card of a pair; enqueue for later merging // Conditional on cardId because promo prints have no muid - see #640 @@ -219,6 +229,9 @@ int OracleImporter::importTextSpoiler(CardSet *set, const QVariant &data) cardLoyalty = map.contains("loyalty") ? map.value("loyalty").toInt() : 0; cardIsToken = map.value("layout") == "token"; + colors.clear(); + extractColors(map.value("colors").toStringList(), colors); + // Distinguish Vanguard cards from regular cards of the same name. if (map.value("layout") == "vanguard") { cardName += " Avatar"; @@ -226,7 +239,7 @@ int OracleImporter::importTextSpoiler(CardSet *set, const QVariant &data) } if (!cardIsToken) { - CardInfo *card = addCard(set->getShortName(), cardName, cardIsToken, cardId, cardCost, cmc, cardType, cardPT, cardLoyalty, cardText); + CardInfo *card = addCard(set->getShortName(), cardName, cardIsToken, cardId, cardCost, cmc, cardType, cardPT, cardLoyalty, cardText, colors); if (!set->contains(card)) { card->addToSet(set); diff --git a/oracle/src/oracleimporter.h b/oracle/src/oracleimporter.h index 730685ab..75a3a7b1 100644 --- a/oracle/src/oracleimporter.h +++ b/oracle/src/oracleimporter.h @@ -32,7 +32,7 @@ private: QVariantMap setsMap; QString dataDir; - CardInfo *addCard(const QString &setName, QString cardName, bool isToken, int cardId, QString &cardCost, QString &cmc, const QString &cardType, const QString &cardPT, int cardLoyalty, const QString &cardText); + CardInfo *addCard(const QString &setName, QString cardName, bool isToken, int cardId, QString &cardCost, QString &cmc, const QString &cardType, const QString &cardPT, int cardLoyalty, const QString &cardText, const QStringList & colors); signals: void setIndexChanged(int cardsImported, int setIndex, const QString &setName); void dataReadProgress(int bytesRead, int totalBytes); @@ -43,6 +43,8 @@ public: int importTextSpoiler(CardSet *set, const QVariant &data); QList &getSets() { return allSets; } const QString &getDataDir() const { return dataDir; } +protected: + void extractColors(const QStringList & in, QStringList & out); }; #endif