From 36f6907fa36b60bcc03e93ca08fd7b3e2da56533 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Sat, 29 Apr 2017 20:01:57 +0200 Subject: [PATCH] Improved token loading --- cockatrice/src/deck_loader.cpp | 12 +++- cockatrice/src/deck_loader.h | 1 + cockatrice/src/deckview.cpp | 10 ++-- cockatrice/src/player.cpp | 2 +- cockatrice/src/tab_deck_editor.cpp | 14 ++--- cockatrice/src/tappedout_interface.cpp | 2 +- common/decklist.cpp | 59 +++++++++++-------- common/decklist.h | 16 +++-- common/server_player.cpp | 12 ++-- .../loading_from_clipboard_test.cpp | 4 +- 10 files changed, 79 insertions(+), 53 deletions(-) diff --git a/cockatrice/src/deck_loader.cpp b/cockatrice/src/deck_loader.cpp index 9dd50310..ef944fa3 100644 --- a/cockatrice/src/deck_loader.cpp +++ b/cockatrice/src/deck_loader.cpp @@ -190,9 +190,19 @@ void DeckLoader::saveToStream_DeckZoneCards(QTextStream &out, const InnerDecklis { DecklistCardNode* card = cards[i]; - if (zoneNode->getName() == "side") + if (zoneNode->getName() == DECK_ZONE_SIDE) out << "SB: "; out << card->getNumber() << " " << card->getName() << "\n"; } } + +QString DeckLoader::getCardZoneFromName(QString cardName, QString currentZoneName) +{ + CardInfo *card = db->getCard(cardName); + if(card && card->getIsToken()) + return DECK_ZONE_TOKENS; + + return currentZoneName; +} + diff --git a/cockatrice/src/deck_loader.h b/cockatrice/src/deck_loader.h index bd5d6ed3..0a449943 100644 --- a/cockatrice/src/deck_loader.h +++ b/cockatrice/src/deck_loader.h @@ -36,6 +36,7 @@ protected: void saveToStream_DeckHeader(QTextStream &out); void saveToStream_DeckZone(QTextStream &out, const InnerDecklistNode *zoneNode); void saveToStream_DeckZoneCards(QTextStream &out, const InnerDecklistNode *zoneNode, QList cards); + virtual QString getCardZoneFromName(QString cardName, QString currentZoneName); }; #endif diff --git a/cockatrice/src/deckview.cpp b/cockatrice/src/deckview.cpp index 066ac706..2a5acccc 100644 --- a/cockatrice/src/deckview.cpp +++ b/cockatrice/src/deckview.cpp @@ -82,7 +82,7 @@ void DeckViewCard::paint(QPainter *painter, const QStyleOptionGraphicsItem *opti QPen pen; pen.setWidth(3); pen.setJoinStyle(Qt::MiterJoin); - pen.setColor(originZone == "main" ? Qt::green : Qt::red); + pen.setColor(originZone == DECK_ZONE_MAIN ? Qt::green : Qt::red); painter->setPen(pen); painter->drawRect(QRectF(1, 1, CARD_WIDTH - 2, CARD_HEIGHT - 2.5)); painter->restore(); @@ -134,10 +134,10 @@ void DeckView::mouseDoubleClickEvent(QMouseEvent *event) m.set_card_name(c->getName().toStdString()); m.set_start_zone(zone->getName().toStdString()); - if (zone->getName() == "main") - m.set_target_zone("side"); - else if (zone->getName() == "side") - m.set_target_zone("main"); + if (zone->getName() == DECK_ZONE_MAIN) + m.set_target_zone(DECK_ZONE_SIDE); + else if (zone->getName() == DECK_ZONE_SIDE) + m.set_target_zone(DECK_ZONE_MAIN); else // Trying to move from another zone m.set_target_zone(zone->getName().toStdString()); diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp index ed1dd317..aedcb4f6 100644 --- a/cockatrice/src/player.cpp +++ b/cockatrice/src/player.cpp @@ -857,7 +857,7 @@ void Player::setDeck(const DeckLoader &_deck) createPredefinedTokenMenu->clear(); predefinedTokens.clear(); - InnerDecklistNode *tokenZone = dynamic_cast(deck->getRoot()->findChild("tokens")); + InnerDecklistNode *tokenZone = dynamic_cast(deck->getRoot()->findChild(DECK_ZONE_TOKENS)); if (tokenZone) for (int i = 0; i < tokenZone->size(); ++i) { diff --git a/cockatrice/src/tab_deck_editor.cpp b/cockatrice/src/tab_deck_editor.cpp index df6194f4..de9503f3 100644 --- a/cockatrice/src/tab_deck_editor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -821,7 +821,7 @@ void TabDeckEditor::addCardHelper(QString zoneName) if(!info) return; if (info->getIsToken()) - zoneName = "tokens"; + zoneName = DECK_ZONE_TOKENS; QModelIndex newCardIndex = deckModel->addCard(info->getName(), zoneName); recursiveExpand(newCardIndex); @@ -843,7 +843,7 @@ void TabDeckEditor::actSwapCard() const QString zoneName = gparent.sibling(gparent.row(), 1).data().toString(); actDecrement(); - const QString otherZoneName = zoneName == "Maindeck" ? "side" : "main"; + const QString otherZoneName = zoneName == "Maindeck" ? DECK_ZONE_SIDE : DECK_ZONE_MAIN; QModelIndex newCardIndex = deckModel->addCard(cardName, otherZoneName); recursiveExpand(newCardIndex); @@ -856,12 +856,12 @@ void TabDeckEditor::actAddCard() if(QApplication::keyboardModifiers() & Qt::ControlModifier) actAddCardToSideboard(); else - addCardHelper("main"); + addCardHelper(DECK_ZONE_MAIN); } void TabDeckEditor::actAddCardToSideboard() { - addCardHelper("side"); + addCardHelper(DECK_ZONE_SIDE); } void TabDeckEditor::actRemoveCard() @@ -898,7 +898,7 @@ void TabDeckEditor::decrementCardHelper(QString zoneName) if(!info) return; if (info->getIsToken()) - zoneName = "tokens"; + zoneName = DECK_ZONE_TOKENS; idx = deckModel->findCard(info->getName(), zoneName); offsetCountAtIndex(idx, -1); @@ -906,12 +906,12 @@ void TabDeckEditor::decrementCardHelper(QString zoneName) void TabDeckEditor::actDecrementCard() { - decrementCardHelper("main"); + decrementCardHelper(DECK_ZONE_MAIN); } void TabDeckEditor::actDecrementCardFromSideboard() { - decrementCardHelper("side"); + decrementCardHelper(DECK_ZONE_SIDE); } void TabDeckEditor::actIncrement() diff --git a/cockatrice/src/tappedout_interface.cpp b/cockatrice/src/tappedout_interface.cpp index c074a5b0..f88f5c2e 100644 --- a/cockatrice/src/tappedout_interface.cpp +++ b/cockatrice/src/tappedout_interface.cpp @@ -109,7 +109,7 @@ struct CopyMainOrSide { return; DecklistCardNode *addedCard; - if(node->getName() == "side") + if(node->getName() == DECK_ZONE_SIDE) addedCard = sideboard.addCard(card->getName(), node->getName()); else addedCard = mainboard.addCard(card->getName(), node->getName()); diff --git a/common/decklist.cpp b/common/decklist.cpp index 3c913fce..cb1ff98f 100644 --- a/common/decklist.cpp +++ b/common/decklist.cpp @@ -95,11 +95,11 @@ InnerDecklistNode::~InnerDecklistNode() QString InnerDecklistNode::visibleNameFromName(const QString &_name) { - if (_name == "main") + if (_name == DECK_ZONE_MAIN) return QObject::tr("Maindeck"); - else if (_name == "side") + else if (_name == DECK_ZONE_SIDE) return QObject::tr("Sideboard"); - else if (_name == "tokens") + else if (_name == DECK_ZONE_TOKENS) return QObject::tr("Tokens"); else return _name; @@ -414,7 +414,7 @@ bool DeckList::readElement(QXmlStreamReader *xml) else if (childName == "comments") comments = xml->readElementText(); else if (childName == "zone") { - InnerDecklistNode *newZone = new InnerDecklistNode(xml->attributes().value("name").toString(), root); + InnerDecklistNode *newZone = getZoneObjFromName(xml->attributes().value("name").toString()); newZone->readElement(xml); } else if (childName == "sideboard_plan") { SideboardPlan *newSideboardPlan = new SideboardPlan; @@ -510,13 +510,14 @@ bool DeckList::loadFromStream_Plain(QTextStream &in) { cleanList(); - InnerDecklistNode *main = 0, *side = 0; - bool inSideboard = false; + bool inSideboard = false, isSideboard = false; int okRows = 0; bool titleFound = false; while (!in.atEnd()) { QString line = in.readLine().simplified(); + + // skip comments if (line.startsWith("//")) { if(!titleFound) @@ -529,23 +530,17 @@ bool DeckList::loadFromStream_Plain(QTextStream &in) continue; } - InnerDecklistNode *zone; + // check for sideboard prefix if (line.startsWith("Sideboard", Qt::CaseInsensitive)) { inSideboard = true; continue; - } else if (line.startsWith("SB:", Qt::CaseInsensitive)) { + } + + isSideboard = inSideboard; + + if (line.startsWith("SB:", Qt::CaseInsensitive)) { line = line.mid(3).trimmed(); - if (!side) - side = new InnerDecklistNode("side", root); - zone = side; - } else if (inSideboard) { - if (!side) - side = new InnerDecklistNode("side", root); - zone = side; - } else { - if (!main) - main = new InnerDecklistNode("main", root); - zone = main; + isSideboard = true; } // Filter out MWS edition symbols and basic land extras @@ -593,13 +588,27 @@ bool DeckList::loadFromStream_Plain(QTextStream &in) cardName.replace(rx, QString("%1 // ").arg(rx.cap(1))); } + // Look for the correct card zone + QString zoneName = getCardZoneFromName(cardName, isSideboard ? DECK_ZONE_SIDE: DECK_ZONE_MAIN); + ++okRows; - new DecklistCardNode(cardName, number, 0, zone); + new DecklistCardNode(cardName, number, 0, getZoneObjFromName(zoneName)); } updateDeckHash(); return (okRows > 0); } +InnerDecklistNode * DeckList::getZoneObjFromName(const QString zoneName) +{ + for (int i = 0; i < root->size(); i++) { + InnerDecklistNode *node = dynamic_cast(root->at(i)); + if(node->getName() == zoneName) + return node; + } + + return new InnerDecklistNode(zoneName, root); +} + bool DeckList::loadFromFile_Plain(QIODevice *device) { QTextStream in(device); @@ -616,7 +625,7 @@ struct WriteToStream { const InnerDecklistNode *node, const DecklistCardNode *card ) { - if (prefixSideboardCards && node->getName() == "side") { + if (prefixSideboardCards && node->getName() == DECK_ZONE_SIDE) { stream << "SB: "; } stream << QString("%1 %2\n").arg( @@ -680,7 +689,7 @@ int DeckList::getSideboardSize() const int size = 0; for (int i = 0; i < root->size(); ++i) { InnerDecklistNode *node = dynamic_cast(root->at(i)); - if (node->getName() != "side") + if (node->getName() != DECK_ZONE_SIDE) continue; for (int j = 0; j < node->size(); j++) { DecklistCardNode *card = dynamic_cast(node->at(j)); @@ -738,8 +747,8 @@ void DeckList::updateDeckHash() bool isValidDeckList = true; QSet hashZones, optionalZones; - hashZones << "main" << "side"; // Zones in deck to be included in hashing process - optionalZones << "tokens"; // Optional zones in deck not included in hashing process + hashZones << DECK_ZONE_MAIN << DECK_ZONE_SIDE; // Zones in deck to be included in hashing process + optionalZones << DECK_ZONE_TOKENS; // Optional zones in deck not included in hashing process for (int i = 0; i < root->size(); i++) { @@ -750,7 +759,7 @@ void DeckList::updateDeckHash() { DecklistCardNode *card = dynamic_cast(node->at(j)); for (int k = 0; k < card->getNumber(); ++k) - cardList.append((node->getName() == "side" ? "SB:" : "") + card->getName().toLower()); + cardList.append((node->getName() == DECK_ZONE_SIDE ? "SB:" : "") + card->getName().toLower()); } else if (!optionalZones.contains(node->getName())) // Not a valid zone -> cheater? { diff --git a/common/decklist.h b/common/decklist.h index 5006cf25..8aac2dca 100644 --- a/common/decklist.h +++ b/common/decklist.h @@ -21,6 +21,10 @@ class QTextStream; class InnerDecklistNode; +#define DECK_ZONE_MAIN "main" +#define DECK_ZONE_SIDE "side" +#define DECK_ZONE_TOKENS "tokens" + class SideboardPlan { private: QString name; @@ -107,17 +111,16 @@ class DecklistCardNode : public AbstractDecklistCardNode { private: QString name; int number; - float price; + float price; public: - DecklistCardNode(const QString &_name = QString(), int _number = 1, float _price = 0, InnerDecklistNode *_parent = 0) : AbstractDecklistCardNode(_parent), name(_name), number(_number), price(_price) { } + DecklistCardNode(const QString &_name = QString(), int _number = 1, float _price = 0, InnerDecklistNode *_parent = 0) : AbstractDecklistCardNode(_parent), name(_name), number(_number), price(_price) { } DecklistCardNode(DecklistCardNode *other, InnerDecklistNode *_parent); int getNumber() const { return number; } void setNumber(int _number) { number = _number; } QString getName() const { return name; } void setName(const QString &_name) { name = _name; } - float getPrice() const { return price; } - - void setPrice(const float _price) { price = _price; } + float getPrice() const { return price; } + void setPrice(const float _price) { price = _price; } }; class DeckList : public QObject { @@ -128,6 +131,9 @@ private: QMap sideboardPlans; InnerDecklistNode *root; void getCardListHelper(InnerDecklistNode *node, QSet &result) const; + InnerDecklistNode *getZoneObjFromName(const QString zoneName); +protected: + virtual QString getCardZoneFromName(QString /* cardName */, QString currentZoneName) { return currentZoneName; }; signals: void deckHashChanged(); public slots: diff --git a/common/server_player.cpp b/common/server_player.cpp index a89af175..e9683228 100644 --- a/common/server_player.cpp +++ b/common/server_player.cpp @@ -170,9 +170,9 @@ void Server_Player::setupZones() for (int i = 0; i < listRoot->size(); ++i) { InnerDecklistNode *currentZone = dynamic_cast(listRoot->at(i)); Server_CardZone *z; - if (currentZone->getName() == "main") + if (currentZone->getName() == DECK_ZONE_MAIN) z = deckZone; - else if (currentZone->getName() == "side") + else if (currentZone->getName() == DECK_ZONE_SIDE) z = sbZone; else continue; @@ -193,15 +193,15 @@ void Server_Player::setupZones() const QString targetZone = QString::fromStdString(m.target_zone()); Server_CardZone *start, *target; - if (startZone == "main") + if (startZone == DECK_ZONE_MAIN) start = deckZone; - else if (startZone == "side") + else if (startZone == DECK_ZONE_SIDE) start = sbZone; else continue; - if (targetZone == "main") + if (targetZone == DECK_ZONE_MAIN) target = deckZone; - else if (targetZone == "side") + else if (targetZone == DECK_ZONE_SIDE) target = sbZone; else continue; diff --git a/tests/loading_from_clipboard/loading_from_clipboard_test.cpp b/tests/loading_from_clipboard/loading_from_clipboard_test.cpp index c1f69a3a..92c0507b 100644 --- a/tests/loading_from_clipboard/loading_from_clipboard_test.cpp +++ b/tests/loading_from_clipboard/loading_from_clipboard_test.cpp @@ -20,9 +20,9 @@ struct DecklistBuilder { explicit DecklistBuilder() : actualMainboard({}), actualSideboard({}) {} void operator()(const InnerDecklistNode *innerDecklistNode, const DecklistCardNode *card) { - if (innerDecklistNode->getName() == "main") { + if (innerDecklistNode->getName() == DECK_ZONE_MAIN) { actualMainboard[card->getName()] += card->getNumber(); - } else if (innerDecklistNode->getName() == "side") { + } else if (innerDecklistNode->getName() == DECK_ZONE_SIDE) { actualSideboard[card->getName()] += card->getNumber(); } else { FAIL();