Handling of tokens/related cards improved. (#2773)

This commit is contained in:
Psithief 2017-06-21 06:35:06 +08:00 committed by Zach H
parent 029a4a39ad
commit ae15f5df06
6 changed files with 298 additions and 64 deletions

View file

@ -33,7 +33,7 @@ CardSet::CardSet(const QString &_shortName, const QString &_longName, const QStr
QString CardSet::getCorrectedShortName() const
{
// Because windows is horrible.
// For Windows machines.
QSet<QString> invalidFileNames;
invalidFileNames << "CON" << "PRN" << "AUX" << "NUL" << "COM1" << "COM2" <<
"COM3" << "COM4" << "COM5" << "COM6" << "COM7" << "COM8" << "COM9" <<
@ -176,8 +176,8 @@ CardInfo::CardInfo(const QString &_name,
const QString &_powtough,
const QString &_text,
const QStringList &_colors,
const QStringList &_relatedCards,
const QStringList &_reverseRelatedCards,
const QList<CardRelation *> &_relatedCards,
const QList<CardRelation *> &_reverseRelatedCards,
bool _upsideDownArt,
int _loyalty,
bool _cipt,
@ -348,14 +348,45 @@ static QXmlStreamWriter &operator<<(QXmlStreamWriter &xml, const CardInfo *info)
for (int i = 0; i < colors.size(); i++)
xml.writeTextElement("color", colors[i]);
const QStringList &related = info->getRelatedCards();
for (int i = 0; i < related.size(); i++)
xml.writeTextElement("related", related[i]);
const QStringList &reverseRelated = info->getReverseRelatedCards();
for (int i = 0; i < reverseRelated.size(); i++)
xml.writeTextElement("reverse-related", reverseRelated[i]);
const QList<CardRelation *> related = info->getRelatedCards();
for (int i = 0; i < related.size(); i++) {
xml.writeStartElement("related");
if (related[i]->getDoesAttach())
xml.writeAttribute("attach", "attach");
if (related[i]->getIsCreateAllExclusion())
xml.writeAttribute("exclude", "exclude");
if (related[i]->getIsVariable()) {
if (1 == related[i]->getDefaultCount())
xml.writeAttribute("count", "x");
else
xml.writeAttribute("count", "x=" + QString::number(related[i]->getDefaultCount()));
}
else if (1 != related[i]->getDefaultCount()) {
xml.writeAttribute("count", QString::number(related[i]->getDefaultCount()));
}
xml.writeCharacters(related[i]->getName());
xml.writeEndElement();
}
const QList<CardRelation *> reverseRelated = info->getReverseRelatedCards();
for (int i = 0; i < reverseRelated.size(); i++) {
xml.writeStartElement("reverse-related");
if (reverseRelated[i]->getDoesAttach())
xml.writeAttribute("attach", "attach");
if (reverseRelated[i]->getIsCreateAllExclusion())
xml.writeAttribute("exclude", "exclude");
if (reverseRelated[i]->getIsVariable()) {
if (1 == reverseRelated[i]->getDefaultCount())
xml.writeAttribute("count", "x");
else
xml.writeAttribute("count", "x=" + QString::number(reverseRelated[i]->getDefaultCount()));
}
else if (1 != reverseRelated[i]->getDefaultCount()) {
xml.writeAttribute("count", QString::number(reverseRelated[i]->getDefaultCount()));
}
xml.writeCharacters(reverseRelated[i]->getName());
xml.writeEndElement();
}
xml.writeTextElement("manacost", info->getManaCost());
xml.writeTextElement("cmc", info->getCmc());
xml.writeTextElement("type", info->getCardType());
@ -419,6 +450,13 @@ void CardDatabase::addCard(CardInfo *card)
void CardDatabase::removeCard(CardInfo *card)
{
foreach(CardRelation * cardRelation, card->getRelatedCards())
cardRelation->deleteLater();
foreach(CardRelation * cardRelation, card->getReverseRelatedCards())
cardRelation->deleteLater();
foreach(CardRelation * cardRelation, card->getReverseRelatedCards2Me())
cardRelation->deleteLater();
cards.remove(card->getName());
simpleNameCards.remove(card->getSimpleName());
emit cardRemoved(card);
@ -505,7 +543,8 @@ void CardDatabase::loadCardsFromXml(QXmlStreamReader &xml)
break;
if (xml.name() == "card") {
QString name, manacost, cmc, type, pt, text;
QStringList colors, relatedCards, reverseRelatedCards;
QStringList colors;
QList<CardRelation *> relatedCards, reverseRelatedCards;
QStringMap customPicURLs;
MuidMap muids;
QStringMap collectorNumbers, rarities;
@ -548,11 +587,38 @@ void CardDatabase::loadCardsFromXml(QXmlStreamReader &xml)
}
} else if (xml.name() == "color")
colors << xml.readElementText();
else if (xml.name() == "related")
relatedCards << xml.readElementText();
else if (xml.name() == "reverse-related")
reverseRelatedCards << xml.readElementText();
else if (xml.name() == "tablerow")
else if (xml.name() == "related" || xml.name() == "reverse-related") {
bool attach = false;
bool exclude = false;
bool variable = false;
int count = 1;
QXmlStreamAttributes attrs = xml.attributes();
QString cardName = xml.readElementText();
if (attrs.hasAttribute("count")) {
if (attrs.value("count").toString().indexOf("x=") == 0) {
variable = true;
count = attrs.value("count").toString().remove(0, 2).toInt();
}
else if (attrs.value("count").toString().indexOf("x") == 0)
variable = true;
else
count = attrs.value("count").toString().toInt();
if (count < 1)
count = 1;
}
if (attrs.hasAttribute("attach")) {
attach = true;
}
if (attrs.hasAttribute("exclude")) {
exclude = true;
}
CardRelation * relation = new CardRelation(cardName, attach, exclude, variable, count);
if (xml.name() == "reverse-related") {
reverseRelatedCards << relation;
} else {
relatedCards << relation;
}
} else if (xml.name() == "tablerow")
tableRow = xml.readElementText().toInt();
else if (xml.name() == "cipt")
cipt = (xml.readElementText() == "1");
@ -725,12 +791,16 @@ void CardDatabase::refreshCachedReverseRelatedCards()
else
relatedCardName = card->getName(); // "name"
foreach(QString targetCard, card->getReverseRelatedCards())
foreach(CardRelation * cardRelation, card->getReverseRelatedCards())
{
const QString & targetCard = cardRelation->getName();
if (!cards.contains(targetCard))
continue;
cards.value(targetCard)->addReverseRelatedCards2Me(relatedCardName);
CardRelation *newCardRelation = new CardRelation(relatedCardName, cardRelation->getDoesAttach(),
cardRelation->getIsCreateAllExclusion(),
cardRelation->getIsVariable(),
cardRelation->getDefaultCount());
cards.value(targetCard)->addReverseRelatedCards2Me(newCardRelation);
}
}
}
@ -830,4 +900,26 @@ bool CardDatabase::saveCustomTokensToFile()
xml.writeEndDocument();
return true;
}
CardRelation::CardRelation(const QString &_name,
bool _doesAttach,
bool _isCreateAllExclusion,
bool _isVariableCount,
int _defaultCount
)
: name(_name),
doesAttach(_doesAttach),
isCreateAllExclusion(_isCreateAllExclusion),
isVariableCount(_isVariableCount),
defaultCount(_defaultCount)
{
}
void CardInfo::resetReverseRelatedCards2Me() {
foreach(CardRelation * cardRelation, this->getReverseRelatedCards2Me()) {
cardRelation->deleteLater();
}
reverseRelatedCardsToMe = QList<CardRelation *>();
}