don't sort split card halves alphabetically (#4244)

* don't sort split card halves alphabetically

fixes #4241
introduces new issue: aftermath cards are now switched upside down

* use list instead of multimap to enforce preservation of a given order
This commit is contained in:
ebbit1q 2021-03-08 18:14:43 +01:00 committed by GitHub
parent 9bbe2f36bc
commit aa6a0313e9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -200,7 +200,7 @@ int OracleImporter::importCardsFromSet(const CardSetPtr &currentSet,
static const QMap<QString, QString> identifierProperties{{"multiverseId", "muid"}, {"scryfallId", "uuid"}}; static const QMap<QString, QString> identifierProperties{{"multiverseId", "muid"}, {"scryfallId", "uuid"}};
int numCards = 0; int numCards = 0;
QMultiMap<QString, SplitCardPart> splitCards; QMap<QString, QList<SplitCardPart>> splitCards;
QString ptSeparator("/"); QString ptSeparator("/");
QVariantMap card; QVariantMap card;
QString layout, name, text, colors, colorIdentity, maintype, power, toughness, faceName; QString layout, name, text, colors, colorIdentity, maintype, power, toughness, faceName;
@ -347,7 +347,14 @@ int OracleImporter::importCardsFromSet(const CardSetPtr &currentSet,
if (layout == "split" || layout == "aftermath" || layout == "adventure") { if (layout == "split" || layout == "aftermath" || layout == "adventure") {
auto faceName = getStringPropertyFromMap(card, "faceName"); auto faceName = getStringPropertyFromMap(card, "faceName");
SplitCardPart split(faceName, text, properties, setInfo); SplitCardPart split(faceName, text, properties, setInfo);
splitCards.insert(name, split); auto found_iter = splitCards.find(name);
if (found_iter == splitCards.end()) {
splitCards.insert(name, {split});
} else if (layout == "adventure") {
found_iter->insert(0, split);
} else {
found_iter->append(split);
}
} else { } else {
// relations // relations
relatedCards.clear(); relatedCards.clear();
@ -377,45 +384,46 @@ int OracleImporter::importCardsFromSet(const CardSetPtr &currentSet,
} }
// split cards handling // split cards handling
QString splitCardPropSeparator = QString(" // "); static const QString splitCardPropSeparator = QString(" // ");
QString splitCardTextSeparator = QString("\n\n---\n\n"); static const QString splitCardTextSeparator = QString("\n\n---\n\n");
for (const QString &nameSplit : splitCards.uniqueKeys()) { for (const QString &nameSplit : splitCards.keys()) {
// get all parts for this specific card // get all parts for this specific card
QList<SplitCardPart> splitCardParts = splitCards.values(nameSplit); QList<SplitCardPart> splitCardParts = splitCards.value(nameSplit);
// sort them by face name QSet<QString> done{};
std::sort(splitCardParts.begin(), splitCardParts.end(),
[](const SplitCardPart &a, const SplitCardPart &b) -> bool { return a.getName() < b.getName(); });
text = QString(""); text.clear();
properties.clear(); properties.clear();
relatedCards.clear(); relatedCards.clear();
QString lastName{};
for (const SplitCardPart &tmp : splitCardParts) { for (const SplitCardPart &tmp : splitCardParts) {
// some sets have 2 different variations of the same split card, // some sets have 2 different variations of the same split card,
// eg. Fire // Ice in WC02. Avoid adding duplicates. // eg. Fire // Ice in WC02. Avoid adding duplicates.
if (lastName == tmp.getName()) QString splitName = tmp.getName();
if (done.contains(splitName)) {
continue; continue;
}
done.insert(splitName);
lastName = tmp.getName(); if (!text.isEmpty()) {
if (!text.isEmpty())
text.append(splitCardTextSeparator); text.append(splitCardTextSeparator);
}
text.append(tmp.getText()); text.append(tmp.getText());
if (properties.isEmpty()) { if (properties.isEmpty()) {
properties = tmp.getProperties(); properties = tmp.getProperties();
setInfo = tmp.getSetInfo(); setInfo = tmp.getSetInfo();
} else { } else {
const QVariantHash &props = tmp.getProperties(); const QVariantHash &tmpProps = tmp.getProperties();
for (const QString &prop : props.keys()) { for (const QString &prop : tmpProps.keys()) {
QString originalPropertyValue = properties.value(prop).toString(); QString originalPropertyValue = properties.value(prop).toString();
QString thisCardPropertyValue = props.value(prop).toString(); QString thisCardPropertyValue = tmpProps.value(prop).toString();
if (originalPropertyValue != thisCardPropertyValue) { if (!thisCardPropertyValue.isEmpty() && originalPropertyValue != thisCardPropertyValue) {
if (prop == "colors") { if (originalPropertyValue.isEmpty()) { // don't create //es if one field is empty
properties.insert(prop, thisCardPropertyValue);
} else if (prop == "colors") { // the card is both colors
properties.insert(prop, originalPropertyValue + thisCardPropertyValue); properties.insert(prop, originalPropertyValue + thisCardPropertyValue);
} else if (prop == "maintype") { // don't create maintypes with //es in them } else if (prop == "maintype") { // don't create maintypes with //es in them
properties.insert(prop, originalPropertyValue); continue;
} else { } else {
properties.insert(prop, properties.insert(prop,
originalPropertyValue + splitCardPropSeparator + thisCardPropertyValue); originalPropertyValue + splitCardPropSeparator + thisCardPropertyValue);