commit
4f972848a5
1 changed files with 152 additions and 128 deletions
|
@ -71,14 +71,8 @@ CardInfo *OracleImporter::addCard(const QString &setName,
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
QStringList cardTextRows = cardText.split("\n");
|
QStringList cardTextRows = cardText.split("\n");
|
||||||
bool splitCard = false;
|
|
||||||
if (cardName.contains('(')) {
|
|
||||||
cardName.remove(QRegExp(" \\(.*\\)"));
|
|
||||||
splitCard = true;
|
|
||||||
}
|
|
||||||
// Workaround for card name weirdness
|
// Workaround for card name weirdness
|
||||||
if (cardName.contains("XX"))
|
|
||||||
cardName.remove("XX");
|
|
||||||
cardName = cardName.replace("Æ", "AE");
|
cardName = cardName.replace("Æ", "AE");
|
||||||
cardName = cardName.replace("’", "'");
|
cardName = cardName.replace("’", "'");
|
||||||
|
|
||||||
|
@ -86,33 +80,29 @@ CardInfo *OracleImporter::addCard(const QString &setName,
|
||||||
cardCost.remove(QChar('{'));
|
cardCost.remove(QChar('{'));
|
||||||
cardCost.remove(QChar('}'));
|
cardCost.remove(QChar('}'));
|
||||||
|
|
||||||
CardInfo *card;
|
// detect mana generator artifacts
|
||||||
if (cards.contains(cardName)) {
|
bool mArtifact = false;
|
||||||
card = cards.value(cardName);
|
if (cardType.endsWith("Artifact"))
|
||||||
if (splitCard && !card->getText().contains(cardText))
|
for (int i = 0; i < cardTextRows.size(); ++i)
|
||||||
card->setText(card->getText() + "\n---\n" + cardText);
|
if (cardTextRows[i].contains("{T}") && cardTextRows[i].contains("to your mana pool"))
|
||||||
} else {
|
mArtifact = true;
|
||||||
bool mArtifact = false;
|
|
||||||
if (cardType.endsWith("Artifact"))
|
|
||||||
for (int i = 0; i < cardTextRows.size(); ++i)
|
|
||||||
if (cardTextRows[i].contains("{T}") && cardTextRows[i].contains("to your mana pool"))
|
|
||||||
mArtifact = true;
|
|
||||||
|
|
||||||
bool cipt = cardText.contains("Hideaway") || (cardText.contains(cardName + " enters the battlefield tapped") && !cardText.contains(cardName + " enters the battlefield tapped unless"));
|
// detect cards that enter the field tapped
|
||||||
|
bool cipt = cardText.contains("Hideaway") || (cardText.contains(cardName + " enters the battlefield tapped") && !cardText.contains(cardName + " enters the battlefield tapped unless"));
|
||||||
|
|
||||||
card = new CardInfo(this, cardName, isToken, cardCost, cmc, cardType, cardPT, cardText, colors, relatedCards, upsideDown, cardLoyalty, cipt);
|
// insert the card and its properties
|
||||||
int tableRow = 1;
|
CardInfo *card = new CardInfo(this, cardName, isToken, cardCost, cmc, cardType, cardPT, cardText, colors, relatedCards, upsideDown, cardLoyalty, cipt);
|
||||||
QString mainCardType = card->getMainCardType();
|
int tableRow = 1;
|
||||||
if ((mainCardType == "Land") || mArtifact)
|
QString mainCardType = card->getMainCardType();
|
||||||
tableRow = 0;
|
if ((mainCardType == "Land") || mArtifact)
|
||||||
else if ((mainCardType == "Sorcery") || (mainCardType == "Instant"))
|
tableRow = 0;
|
||||||
tableRow = 3;
|
else if ((mainCardType == "Sorcery") || (mainCardType == "Instant"))
|
||||||
else if (mainCardType == "Creature")
|
tableRow = 3;
|
||||||
tableRow = 2;
|
else if (mainCardType == "Creature")
|
||||||
card->setTableRow(tableRow);
|
tableRow = 2;
|
||||||
|
card->setTableRow(tableRow);
|
||||||
|
|
||||||
cards.insert(cardName, card);
|
cards.insert(cardName, card);
|
||||||
}
|
|
||||||
card->setMuId(setName, cardId);
|
card->setMuId(setName, cardId);
|
||||||
|
|
||||||
return card;
|
return card;
|
||||||
|
@ -153,110 +143,144 @@ int OracleImporter::importTextSpoiler(CardSet *set, const QVariant &data)
|
||||||
QStringList relatedCards;
|
QStringList relatedCards;
|
||||||
int cardId;
|
int cardId;
|
||||||
int cardLoyalty;
|
int cardLoyalty;
|
||||||
bool cardIsToken = false;
|
|
||||||
bool upsideDown = false;
|
bool upsideDown = false;
|
||||||
QMap<int, QVariantMap> splitCards;
|
QMap<int, QVariantMap> splitCards;
|
||||||
|
|
||||||
while (it.hasNext()) {
|
while (it.hasNext())
|
||||||
|
{
|
||||||
map = it.next().toMap();
|
map = it.next().toMap();
|
||||||
if(0 == QString::compare(map.value("layout").toString(), QString("split"), Qt::CaseInsensitive))
|
|
||||||
|
QString layout = map.value("layout").toString();
|
||||||
|
|
||||||
|
if(layout == "token")
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(layout == "split")
|
||||||
{
|
{
|
||||||
// Split card handling
|
// Enqueue split card for later handling
|
||||||
cardId = map.contains("multiverseid") ? map.value("multiverseid").toInt() : 0;
|
cardId = map.contains("multiverseid") ? map.value("multiverseid").toInt() : 0;
|
||||||
if(splitCards.contains(cardId))
|
if (cardId)
|
||||||
{
|
splitCards.insertMulti(cardId, map);
|
||||||
// merge two split cards
|
continue;
|
||||||
QVariantMap tmpMap = splitCards.take(cardId);
|
}
|
||||||
QVariantMap * card1 = 0, * card2 = 0;
|
|
||||||
// same cardid
|
|
||||||
cardId = map.contains("multiverseid") ? map.value("multiverseid").toInt() : 0;
|
|
||||||
// this is currently an integer; can't accept 2 values
|
|
||||||
cardLoyalty = 0;
|
|
||||||
|
|
||||||
// determine which subcard is the first one in the split
|
// normal cards handling
|
||||||
QStringList names=map.contains("names") ? map.value("names").toStringList() : QStringList();
|
cardName = map.contains("name") ? map.value("name").toString() : QString("");
|
||||||
if(names.count()>0 &&
|
cardCost = map.contains("manaCost") ? map.value("manaCost").toString() : QString("");
|
||||||
map.contains("name") &&
|
cmc = map.contains("cmc") ? map.value("cmc").toString() : QString("0");
|
||||||
0 == QString::compare(map.value("name").toString(), names.at(0)))
|
cardType = map.contains("type") ? map.value("type").toString() : QString("");
|
||||||
{
|
cardPT = map.contains("power") || map.contains("toughness") ? map.value("power").toString() + QString('/') + map.value("toughness").toString() : QString("");
|
||||||
// map is the left part of the split card, tmpMap is right part
|
cardText = map.contains("text") ? map.value("text").toString() : QString("");
|
||||||
card1 = ↦
|
cardId = map.contains("multiverseid") ? map.value("multiverseid").toInt() : 0;
|
||||||
card2 = &tmpMap;
|
cardLoyalty = map.contains("loyalty") ? map.value("loyalty").toInt() : 0;
|
||||||
} else {
|
relatedCards = map.contains("names") ? map.value("names").toStringList() : QStringList();
|
||||||
//tmpMap is the left part of the split card, map is right part
|
relatedCards.removeAll(cardName);
|
||||||
card1 = &tmpMap;
|
|
||||||
card2 = ↦
|
|
||||||
}
|
|
||||||
|
|
||||||
// add first card's data
|
if(0 == QString::compare(map.value("layout").toString(), QString("flip"), Qt::CaseInsensitive))
|
||||||
cardName = card1->contains("name") ? card1->value("name").toString() : QString("");
|
{
|
||||||
cardCost = card1->contains("manaCost") ? card1->value("manaCost").toString() : QString("");
|
QStringList cardNames = map.contains("names") ? map.value("names").toStringList() : QStringList();
|
||||||
cmc = card1->contains("cmc") ? card1->value("cmc").toString() : QString("0");
|
upsideDown = (cardNames.indexOf(cardName) > 0);
|
||||||
cardType = card1->contains("type") ? card1->value("type").toString() : QString("");
|
|
||||||
cardPT = card1->contains("power") || card1->contains("toughness") ? card1->value("power").toString() + QString('/') + card1->value("toughness").toString() : QString("");
|
|
||||||
cardText = card1->contains("text") ? card1->value("text").toString() : QString("");
|
|
||||||
|
|
||||||
// add second card's data
|
|
||||||
cardName += card2->contains("name") ? QString(" // ") + card2->value("name").toString() : QString("");
|
|
||||||
cardCost += card2->contains("manaCost") ? QString(" // ") + card2->value("manaCost").toString() : QString("");
|
|
||||||
cmc += card2->contains("cmc") ? QString(" // ") + card2->value("cmc").toString() : QString("0");
|
|
||||||
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();
|
|
||||||
|
|
||||||
relatedCards = QStringList();
|
|
||||||
upsideDown = false;
|
|
||||||
} else {
|
|
||||||
// first card of a pair; enqueue for later merging
|
|
||||||
// Conditional on cardId because promo prints have no muid - see #640
|
|
||||||
if (cardId)
|
|
||||||
splitCards.insert(cardId, map);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// normal cards handling
|
upsideDown = false;
|
||||||
cardName = map.contains("name") ? map.value("name").toString() : QString("");
|
}
|
||||||
cardCost = map.contains("manaCost") ? map.value("manaCost").toString() : QString("");
|
|
||||||
cmc = map.contains("cmc") ? map.value("cmc").toString() : QString("0");
|
|
||||||
cardType = map.contains("type") ? map.value("type").toString() : QString("");
|
|
||||||
cardPT = map.contains("power") || map.contains("toughness") ? map.value("power").toString() + QString('/') + map.value("toughness").toString() : QString("");
|
|
||||||
cardText = map.contains("text") ? map.value("text").toString() : QString("");
|
|
||||||
cardId = map.contains("multiverseid") ? map.value("multiverseid").toInt() : 0;
|
|
||||||
cardLoyalty = map.contains("loyalty") ? map.value("loyalty").toInt() : 0;
|
|
||||||
cardIsToken = map.value("layout") == "token";
|
|
||||||
relatedCards = map.contains("names") ? map.value("names").toStringList() : QStringList();
|
|
||||||
relatedCards.removeAll(cardName);
|
|
||||||
|
|
||||||
if(0 == QString::compare(map.value("layout").toString(), QString("flip"), Qt::CaseInsensitive))
|
colors.clear();
|
||||||
|
extractColors(map.value("colors").toStringList(), colors);
|
||||||
|
|
||||||
|
CardInfo *card = addCard(set->getShortName(), cardName, false, cardId, cardCost, cmc, cardType, cardPT, cardLoyalty, cardText, colors, relatedCards, upsideDown);
|
||||||
|
|
||||||
|
if (!set->contains(card)) {
|
||||||
|
card->addToSet(set);
|
||||||
|
cards++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// split cards handling - get all unique card muids
|
||||||
|
QList<int> muids = splitCards.uniqueKeys();
|
||||||
|
foreach(int muid, muids)
|
||||||
|
{
|
||||||
|
// get all cards for this specific muid
|
||||||
|
QList<QVariantMap> maps = splitCards.values(muid);
|
||||||
|
QStringList names;
|
||||||
|
// now, reorder the cards using the ordered list of names
|
||||||
|
QMap<int, QVariantMap> orderedMaps;
|
||||||
|
foreach(QVariantMap map, maps)
|
||||||
|
{
|
||||||
|
if(names.isEmpty())
|
||||||
|
names = map.contains("names") ? map.value("names").toStringList() : QStringList();
|
||||||
|
QString name = map.value("name").toString();
|
||||||
|
int index = names.indexOf(name);
|
||||||
|
orderedMaps.insertMulti(index, map);
|
||||||
|
}
|
||||||
|
|
||||||
|
// clean variables
|
||||||
|
cardName = "";
|
||||||
|
cardCost = "";
|
||||||
|
cmc = "";
|
||||||
|
cardType = "";
|
||||||
|
cardPT = "";
|
||||||
|
cardText = "";
|
||||||
|
colors.clear();
|
||||||
|
// this is currently an integer; can't accept 2 values
|
||||||
|
cardLoyalty = 0;
|
||||||
|
|
||||||
|
// loop cards and merge their contents
|
||||||
|
QString prefix = QString(" // ");
|
||||||
|
QString prefix2 = QString("\n\n---\n\n");
|
||||||
|
foreach(QVariantMap map, orderedMaps.values())
|
||||||
|
{
|
||||||
|
if(map.contains("name"))
|
||||||
{
|
{
|
||||||
QStringList cardNames = map.contains("names") ? map.value("names").toStringList() : QStringList();
|
if(!cardName.isEmpty())
|
||||||
upsideDown = (cardNames.indexOf(cardName) > 0);
|
cardName += prefix;
|
||||||
} else {
|
cardName += map.value("name").toString();
|
||||||
upsideDown = false;
|
}
|
||||||
|
if(map.contains("manaCost"))
|
||||||
|
{
|
||||||
|
if(!cardCost.isEmpty())
|
||||||
|
cardCost += prefix;
|
||||||
|
cardCost += map.value("manaCost").toString();
|
||||||
|
}
|
||||||
|
if(map.contains("cmc"))
|
||||||
|
{
|
||||||
|
if(!cmc.isEmpty())
|
||||||
|
cmc += prefix;
|
||||||
|
cmc += map.value("cmc").toString();
|
||||||
|
}
|
||||||
|
if(map.contains("type"))
|
||||||
|
{
|
||||||
|
if(!cardType.isEmpty())
|
||||||
|
cardType += prefix;
|
||||||
|
cardType += map.value("type").toString();
|
||||||
|
}
|
||||||
|
if(map.contains("power") || map.contains("toughness"))
|
||||||
|
{
|
||||||
|
if(!cardPT.isEmpty())
|
||||||
|
cardPT += prefix;
|
||||||
|
cardPT += map.value("power").toString() + QString('/') + map.value("toughness").toString();
|
||||||
|
}
|
||||||
|
if(map.contains("text"))
|
||||||
|
{
|
||||||
|
if(!cardText.isEmpty())
|
||||||
|
cardText += prefix2;
|
||||||
|
cardText += map.value("text").toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
colors.clear();
|
|
||||||
extractColors(map.value("colors").toStringList(), colors);
|
extractColors(map.value("colors").toStringList(), colors);
|
||||||
|
|
||||||
// Distinguish Vanguard cards from regular cards of the same name.
|
|
||||||
if (map.value("layout") == "vanguard") {
|
|
||||||
cardName += " Avatar";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cardIsToken) {
|
colors.removeDuplicates();
|
||||||
CardInfo *card = addCard(set->getShortName(), cardName, cardIsToken, cardId, cardCost, cmc, cardType, cardPT, cardLoyalty, cardText, colors, relatedCards, upsideDown);
|
relatedCards = QStringList();
|
||||||
|
upsideDown = false;
|
||||||
|
|
||||||
if (!set->contains(card)) {
|
// add the card
|
||||||
card->addToSet(set);
|
CardInfo *card = addCard(set->getShortName(), cardName, false, muid, cardCost, cmc, cardType, cardPT, cardLoyalty, cardText, colors, relatedCards, upsideDown);
|
||||||
cards++;
|
|
||||||
}
|
if (!set->contains(card)) {
|
||||||
|
card->addToSet(set);
|
||||||
|
cards++;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return cards;
|
return cards;
|
||||||
|
|
Loading…
Reference in a new issue