From 35f8c9f4441900e4e3dc1927e8657c3582ba1825 Mon Sep 17 00:00:00 2001 From: RickyRister Date: Sun, 7 Dec 2025 19:45:54 -0800 Subject: [PATCH] replace direct calls to getRoot and forEachCard --- cockatrice/src/filters/deck_filter_string.cpp | 5 +- .../src/game/player/menu/utility_menu.cpp | 13 ++- .../src/interface/deck_loader/deck_loader.cpp | 9 +- .../libcockatrice/deck_list/deck_list.cpp | 41 +++------ .../models/deck_list/deck_list_model.cpp | 89 ++++++------------- .../models/deck_list/deck_list_model.h | 2 +- .../server/remote/game/server_player.cpp | 28 ++---- 7 files changed, 61 insertions(+), 126 deletions(-) diff --git a/cockatrice/src/filters/deck_filter_string.cpp b/cockatrice/src/filters/deck_filter_string.cpp index 52b6a38d1..dfc54afe0 100644 --- a/cockatrice/src/filters/deck_filter_string.cpp +++ b/cockatrice/src/filters/deck_filter_string.cpp @@ -118,12 +118,13 @@ static void setupParserRules() return [=](const DeckPreviewWidget *deck, const ExtraDeckSearchInfo &) -> bool { int count = 0; - deck->deckLoader->getDeckList()->forEachCard([&](InnerDecklistNode *, const DecklistCardNode *node) { + auto cardNodes = deck->deckLoader->getDeckList()->getCardNodes(); + for (auto node : cardNodes) { auto cardInfoPtr = CardDatabaseManager::query()->getCardInfo(node->getName()); if (!cardInfoPtr.isNull() && cardFilter.check(cardInfoPtr)) { count += node->getNumber(); } - }); + } return numberMatcher(count); }; }; diff --git a/cockatrice/src/game/player/menu/utility_menu.cpp b/cockatrice/src/game/player/menu/utility_menu.cpp index a3117abf8..ab14d629a 100644 --- a/cockatrice/src/game/player/menu/utility_menu.cpp +++ b/cockatrice/src/game/player/menu/utility_menu.cpp @@ -5,6 +5,7 @@ #include "../player_actions.h" #include "player_menu.h" +#include #include UtilityMenu::UtilityMenu(Player *_player, QMenu *playerMenu) : QMenu(playerMenu), player(_player) @@ -65,15 +66,13 @@ void UtilityMenu::populatePredefinedTokensMenu() return; } - InnerDecklistNode *tokenZone = - dynamic_cast(_deck->getDeckList()->getRoot()->findChild(DECK_ZONE_TOKENS)); + auto tokenCardNodes = _deck->getDeckList()->getCardNodes({DECK_ZONE_TOKENS}); - if (tokenZone) { - if (!tokenZone->empty()) - setEnabled(true); + if (!tokenCardNodes.isEmpty()) { + setEnabled(true); - for (int i = 0; i < tokenZone->size(); ++i) { - const QString tokenName = tokenZone->at(i)->getName(); + for (int i = 0; i < tokenCardNodes.size(); ++i) { + const QString tokenName = tokenCardNodes[i]->getName(); predefinedTokens.append(tokenName); QAction *a = addAction(tokenName); if (i < 10) { diff --git a/cockatrice/src/interface/deck_loader/deck_loader.cpp b/cockatrice/src/interface/deck_loader/deck_loader.cpp index d866b684b..841c67056 100644 --- a/cockatrice/src/interface/deck_loader/deck_loader.cpp +++ b/cockatrice/src/interface/deck_loader/deck_loader.cpp @@ -335,9 +335,7 @@ bool DeckLoader::saveToStream_Plain(QTextStream &out, } // loop zones - for (int i = 0; i < deckList->getRoot()->size(); i++) { - const auto *zoneNode = dynamic_cast(deckList->getRoot()->at(i)); - + for (auto zoneNode : deckList->getZoneNodes()) { saveToStream_DeckZone(out, zoneNode, addComments, addSetNameAndNumber); // end of zone @@ -597,12 +595,11 @@ void DeckLoader::printDeckList(QPrinter *printer, const DeckList *deckList) cursor.insertText(deckList->getComments()); cursor.insertBlock(headerBlockFormat, headerCharFormat); - for (int i = 0; i < deckList->getRoot()->size(); i++) { + for (auto zoneNode : deckList->getZoneNodes()) { cursor.insertHtml("
"); - // cursor.insertHtml("
"); cursor.insertBlock(headerBlockFormat, headerCharFormat); - printDeckListNode(&cursor, dynamic_cast(deckList->getRoot()->at(i))); + printDeckListNode(&cursor, zoneNode); } doc.print(printer); diff --git a/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.cpp b/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.cpp index dc069a4ce..bbe670528 100644 --- a/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.cpp +++ b/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.cpp @@ -579,18 +579,13 @@ QList DeckList::getZoneNodes() const int DeckList::getSideboardSize() const { - int size = 0; - for (int i = 0; i < root->size(); ++i) { - auto *node = dynamic_cast(root->at(i)); - if (node->getName() != DECK_ZONE_SIDE) { - continue; - } + auto cards = getCardNodes({DECK_ZONE_SIDE}); - for (int j = 0; j < node->size(); j++) { - auto *card = dynamic_cast(node->at(j)); - size += card->getNumber(); - } + int size = 0; + for (auto card : cards) { + size += card->getNumber(); } + return size; } @@ -656,26 +651,18 @@ bool DeckList::deleteNode(AbstractDecklistNode *node, InnerDecklistNode *rootNod return false; } -static QString computeDeckHash(const InnerDecklistNode *root) +static QString computeDeckHash(const DeckList &deckList) { + auto mainDeckNodes = deckList.getCardNodes({DECK_ZONE_MAIN}); + auto sideDeckNodes = deckList.getCardNodes({DECK_ZONE_SIDE}); + QStringList cardList; - QSet hashZones, optionalZones; - 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 + std::transform(mainDeckNodes.cbegin(), mainDeckNodes.cend(), std::back_inserter(cardList), + [](auto node) { return node->getName().toLower(); }); + std::transform(sideDeckNodes.cbegin(), sideDeckNodes.cend(), std::back_inserter(cardList), + [](auto node) { return "SB:" + node->getName().toLower(); }); - for (int i = 0; i < root->size(); i++) { - auto *node = dynamic_cast(root->at(i)); - for (int j = 0; j < node->size(); j++) { - if (hashZones.contains(node->getName())) // Mainboard or Sideboard - { - auto *card = dynamic_cast(node->at(j)); - for (int k = 0; k < card->getNumber(); ++k) { - cardList.append((node->getName() == DECK_ZONE_SIDE ? "SB:" : "") + card->getName().toLower()); - } - } - } - } cardList.sort(); QByteArray deckHashArray = QCryptographicHash::hash(cardList.join(";").toUtf8(), QCryptographicHash::Sha1); quint64 number = (((quint64)(unsigned char)deckHashArray[0]) << 32) + @@ -697,7 +684,7 @@ QString DeckList::getDeckHash() const return cachedDeckHash; } - cachedDeckHash = computeDeckHash(root); + cachedDeckHash = computeDeckHash(*this); return cachedDeckHash; } diff --git a/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.cpp b/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.cpp index bd16ab3d2..2856198b8 100644 --- a/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.cpp +++ b/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.cpp @@ -550,86 +550,49 @@ void DeckListModel::setDeckList(DeckList *_deck) QList DeckListModel::getCards() const { - QList cards; - DeckList *decklist = getDeckList(); - if (!decklist) { - return cards; - } - InnerDecklistNode *listRoot = decklist->getRoot(); - if (!listRoot) - return cards; + auto nodes = deckList->getCardNodes(); - for (int i = 0; i < listRoot->size(); i++) { - InnerDecklistNode *currentZone = dynamic_cast(listRoot->at(i)); - if (!currentZone) - continue; - for (int j = 0; j < currentZone->size(); j++) { - DecklistCardNode *currentCard = dynamic_cast(currentZone->at(j)); - if (!currentCard) - continue; - for (int k = 0; k < currentCard->getNumber(); ++k) { - ExactCard card = CardDatabaseManager::query()->getCard(currentCard->toCardRef()); - if (card) { - cards.append(card); - } else { - qDebug() << "Card not found in database!"; - } + QList cards; + for (auto node : nodes) { + ExactCard card = CardDatabaseManager::query()->getCard(node->toCardRef()); + if (card) { + for (int k = 0; k < node->getNumber(); ++k) { + cards.append(card); } + } else { + qDebug() << "Card not found in database!"; } } + return cards; } QList DeckListModel::getCardsForZone(const QString &zoneName) const { - QList cards; - DeckList *decklist = getDeckList(); - if (!decklist) { - return cards; - } - InnerDecklistNode *listRoot = decklist->getRoot(); - if (!listRoot) - return cards; + auto nodes = deckList->getCardNodes({zoneName}); - for (int i = 0; i < listRoot->size(); i++) { - InnerDecklistNode *currentZone = dynamic_cast(listRoot->at(i)); - if (!currentZone) - continue; - if (currentZone->getName() == zoneName) { - for (int j = 0; j < currentZone->size(); j++) { - DecklistCardNode *currentCard = dynamic_cast(currentZone->at(j)); - if (!currentCard) - continue; - for (int k = 0; k < currentCard->getNumber(); ++k) { - ExactCard card = CardDatabaseManager::query()->getCard(currentCard->toCardRef()); - if (card) { - cards.append(card); - } else { - qDebug() << "Card not found in database!"; - } - } + QList cards; + for (auto node : nodes) { + ExactCard card = CardDatabaseManager::query()->getCard(node->toCardRef()); + if (card) { + for (int k = 0; k < node->getNumber(); ++k) { + cards.append(card); } + } else { + qDebug() << "Card not found in database!"; } } + return cards; } -QList *DeckListModel::getZones() const +QList DeckListModel::getZones() const { - QList *zones = new QList(); - DeckList *decklist = getDeckList(); - if (!decklist) { - return zones; - } - InnerDecklistNode *listRoot = decklist->getRoot(); - if (!listRoot) - return zones; + auto zoneNodes = deckList->getZoneNodes(); + + QList zones; + std::transform(zoneNodes.cbegin(), zoneNodes.cend(), std::back_inserter(zones), + [](auto zoneNode) { return zoneNode->getName(); }); - for (int i = 0; i < listRoot->size(); i++) { - InnerDecklistNode *currentZone = dynamic_cast(listRoot->at(i)); - if (!currentZone) - continue; - zones->append(currentZone->getName()); - } return zones; } \ No newline at end of file diff --git a/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.h b/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.h index a480c606b..0b47faed4 100644 --- a/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.h +++ b/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.h @@ -300,7 +300,7 @@ public: [[nodiscard]] QList getCards() const; [[nodiscard]] QList getCardsForZone(const QString &zoneName) const; - [[nodiscard]] QList *getZones() const; + [[nodiscard]] QList getZones() const; /** * @brief Sets the criteria used to group cards in the model. diff --git a/libcockatrice_network/libcockatrice/network/server/remote/game/server_player.cpp b/libcockatrice_network/libcockatrice/network/server/remote/game/server_player.cpp index 8190155e9..e62f861a9 100644 --- a/libcockatrice_network/libcockatrice/network/server/remote/game/server_player.cpp +++ b/libcockatrice_network/libcockatrice/network/server/remote/game/server_player.cpp @@ -102,28 +102,16 @@ void Server_Player::setupZones() // ------------------------------------------------------------------ // Assign card ids and create deck from deck list - InnerDecklistNode *listRoot = deck->getRoot(); - for (int i = 0; i < listRoot->size(); ++i) { - auto *currentZone = dynamic_cast(listRoot->at(i)); - Server_CardZone *z; - if (currentZone->getName() == DECK_ZONE_MAIN) { - z = deckZone; - } else if (currentZone->getName() == DECK_ZONE_SIDE) { - z = sbZone; - } else { - continue; + auto insertCardsIntoZone = [this](auto cards, auto *zone) { + for (auto card : cards) { + for (int k = 0; k < card->getNumber(); ++k) { + zone->insertCard(new Server_Card(card->toCardRef(), nextCardId++, 0, 0, zone), -1, 0); + } } + }; - for (int j = 0; j < currentZone->size(); ++j) { - auto *currentCard = dynamic_cast(currentZone->at(j)); - if (!currentCard) { - continue; - } - for (int k = 0; k < currentCard->getNumber(); ++k) { - z->insertCard(new Server_Card(currentCard->toCardRef(), nextCardId++, 0, 0, z), -1, 0); - } - } - } + insertCardsIntoZone(deck->getCardNodes({DECK_ZONE_MAIN}), deckZone); + insertCardsIntoZone(deck->getCardNodes({DECK_ZONE_SIDE}), sbZone); const QList &sideboardPlan = deck->getCurrentSideboardPlan(); for (const auto &m : sideboardPlan) {