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:
parent
9bbe2f36bc
commit
aa6a0313e9
1 changed files with 29 additions and 21 deletions
|
@ -200,7 +200,7 @@ int OracleImporter::importCardsFromSet(const CardSetPtr ¤tSet,
|
||||||
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 ¤tSet,
|
||||||
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 ¤tSet,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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);
|
||||||
|
|
Loading…
Reference in a new issue