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/deckview/deck_view.cpp b/cockatrice/src/game/deckview/deck_view.cpp index edef3fad4..383545cf3 100644 --- a/cockatrice/src/game/deckview/deck_view.cpp +++ b/cockatrice/src/game/deckview/deck_view.cpp @@ -343,10 +343,7 @@ void DeckViewScene::rebuildTree() if (!deck) return; - InnerDecklistNode *listRoot = deck->getRoot(); - for (int i = 0; i < listRoot->size(); i++) { - auto *currentZone = dynamic_cast(listRoot->at(i)); - + for (auto *currentZone : deck->getZoneNodes()) { DeckViewCardContainer *container = cardContainers.value(currentZone->getName(), 0); if (!container) { container = new DeckViewCardContainer(currentZone->getName()); 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..a3f0ff619 100644 --- a/cockatrice/src/interface/deck_loader/deck_loader.cpp +++ b/cockatrice/src/interface/deck_loader/deck_loader.cpp @@ -269,6 +269,20 @@ static QString toDecklistExportString(const DecklistCardNode *card) return cardString; } +/** + * Converts all cards in the list to their decklist export string and joins them into one string + */ +static QString toDecklistExportString(const QList &cardNodes) +{ + QString result; + + for (auto cardNode : cardNodes) { + result += toDecklistExportString(cardNode); + } + + return result; +} + /** * Export deck to decklist function, called to format the deck in a way to be sent to a server * @@ -279,29 +293,11 @@ QString DeckLoader::exportDeckToDecklist(const DeckList *deckList, DecklistWebsi { // Add the base url QString deckString = "https://" + getDomainForWebsite(website) + "/?"; - // Create two strings to pass to function - QString mainBoardCards, sideBoardCards; - // Set up the function to call - auto formatDeckListForExport = [&mainBoardCards, &sideBoardCards](const auto *node, const auto *card) { - // Get the card name - CardInfoPtr dbCard = CardDatabaseManager::query()->getCardInfo(card->getName()); - if (!dbCard || dbCard->getIsToken()) { - // If it's a token, we don't care about the card. - return; - } + // export all cards in zone + QString mainBoardCards = toDecklistExportString(deckList->getCardNodes({DECK_ZONE_MAIN})); + QString sideBoardCards = toDecklistExportString(deckList->getCardNodes({DECK_ZONE_SIDE})); - // Check if it's a sideboard card. - if (node->getName() == DECK_ZONE_SIDE) { - sideBoardCards += toDecklistExportString(card); - } else { - // If it's a mainboard card, do the same thing, but for the mainboard card string - mainBoardCards += toDecklistExportString(card); - } - }; - - // call our struct function for each card in the deck - deckList->forEachCard(formatDeckListForExport); // Remove the extra return at the end of the last cards mainBoardCards.chop(3); sideBoardCards.chop(3); @@ -335,9 +331,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 @@ -514,7 +508,7 @@ QString DeckLoader::getCompleteCardName(const QString &cardName) return cardName; } -void DeckLoader::printDeckListNode(QTextCursor *cursor, InnerDecklistNode *node) +void DeckLoader::printDeckListNode(QTextCursor *cursor, const InnerDecklistNode *node) { const int totalColumns = 2; @@ -597,12 +591,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/cockatrice/src/interface/deck_loader/deck_loader.h b/cockatrice/src/interface/deck_loader/deck_loader.h index 474eee149..ae3088ff8 100644 --- a/cockatrice/src/interface/deck_loader/deck_loader.h +++ b/cockatrice/src/interface/deck_loader/deck_loader.h @@ -94,7 +94,7 @@ public: } private: - static void printDeckListNode(QTextCursor *cursor, InnerDecklistNode *node); + static void printDeckListNode(QTextCursor *cursor, const InnerDecklistNode *node); static void saveToStream_DeckHeader(QTextStream &out, const DeckList *deckList); static void saveToStream_DeckZone(QTextStream &out, diff --git a/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp b/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp index 7e4287ac5..08ebf23ba 100644 --- a/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp +++ b/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp @@ -337,7 +337,7 @@ void DeckEditorDeckDockWidget::updateBannerCardComboBox() // Collect unique (name, providerId) pairs QSet> bannerCardSet; - QList cardsInDeck = deckModel->getDeckList()->getCardNodes(); + QList cardsInDeck = deckModel->getDeckList()->getCardNodes(); for (auto currentCard : cardsInDeck) { if (!CardDatabaseManager::query()->getCard(currentCard->toCardRef())) { diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_select_set_for_cards.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_select_set_for_cards.cpp index 5b6eff923..2bfe650c3 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_select_set_for_cards.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_select_set_for_cards.cpp @@ -228,7 +228,7 @@ QMap DlgSelectSetForCards::getSetsForCards() if (!decklist) return setCounts; - QList cardsInDeck = decklist->getCardNodes(); + QList cardsInDeck = decklist->getCardNodes(); for (auto currentCard : cardsInDeck) { CardInfoPtr infoPtr = CardDatabaseManager::query()->getCardInfo(currentCard->getName()); @@ -271,7 +271,7 @@ void DlgSelectSetForCards::updateCardLists() if (!decklist) return; - QList cardsInDeck = decklist->getCardNodes(); + QList cardsInDeck = decklist->getCardNodes(); for (auto currentCard : cardsInDeck) { bool found = false; @@ -360,7 +360,7 @@ QMap DlgSelectSetForCards::getCardsForSets() if (!decklist) return setCards; - QList cardsInDeck = decklist->getCardNodes(); + QList cardsInDeck = decklist->getCardNodes(); for (auto currentCard : cardsInDeck) { CardInfoPtr infoPtr = CardDatabaseManager::query()->getCardInfo(currentCard->getName()); diff --git a/cockatrice/src/interface/widgets/printing_selector/card_amount_widget.cpp b/cockatrice/src/interface/widgets/printing_selector/card_amount_widget.cpp index 80258be61..0d0195d34 100644 --- a/cockatrice/src/interface/widgets/printing_selector/card_amount_widget.cpp +++ b/cockatrice/src/interface/widgets/printing_selector/card_amount_widget.cpp @@ -311,7 +311,7 @@ int CardAmountWidget::countCardsInZone(const QString &deckZone) return -1; } - QList cardsInDeck = decklist->getCardNodes({deckZone}); + QList cardsInDeck = decklist->getCardNodes({deckZone}); int count = 0; for (auto currentCard : cardsInDeck) { diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_name_filter_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_name_filter_widget.cpp index 28c4e5ab9..9bc506056 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_name_filter_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_name_filter_widget.cpp @@ -68,7 +68,7 @@ void VisualDatabaseDisplayNameFilterWidget::actLoadFromDeck() if (!decklist) return; - QList cardsInDeck = decklist->getCardNodes(); + QList cardsInDeck = decklist->getCardNodes(); for (auto currentCard : cardsInDeck) { createNameFilter(currentCard->getName()); diff --git a/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp index b1db1cf37..341b94a3b 100644 --- a/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp @@ -84,7 +84,7 @@ QList VisualDeckEditorSampleHandWidget::getRandomCards(int amountToGe if (!decklist) return randomCards; - QList cardsInDeck = decklist->getCardNodes({DECK_ZONE_MAIN}); + QList cardsInDeck = decklist->getCardNodes({DECK_ZONE_MAIN}); // Collect all cards in the main deck, allowing duplicates based on their count for (auto currentCard : cardsInDeck) { diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp index 1db0feb63..68243100c 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp @@ -235,7 +235,7 @@ void DeckPreviewWidget::updateBannerCardComboBox() // Prepare the new items with deduplication QSet> bannerCardSet; - QList cardsInDeck = deckLoader->getDeckList()->getCardNodes(); + QList cardsInDeck = deckLoader->getDeckList()->getCardNodes(); for (auto currentCard : cardsInDeck) { for (int k = 0; k < currentCard->getNumber(); ++k) { diff --git a/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.cpp b/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.cpp index cea759428..333be017b 100644 --- a/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.cpp +++ b/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.cpp @@ -523,56 +523,34 @@ void DeckList::cleanList(bool preserveMetadata) refreshDeckHash(); } -void DeckList::getCardListHelper(InnerDecklistNode *item, QSet &result) -{ - for (int i = 0; i < item->size(); ++i) { - auto *node = dynamic_cast(item->at(i)); - - if (node) { - result.insert(node->getName()); - } else { - getCardListHelper(dynamic_cast(item->at(i)), result); - } - } -} - -void DeckList::getCardRefListHelper(InnerDecklistNode *item, QList &result) -{ - for (int i = 0; i < item->size(); ++i) { - auto *node = dynamic_cast(item->at(i)); - - if (node) { - result.append(node->toCardRef()); - } else { - getCardRefListHelper(dynamic_cast(item->at(i)), result); - } - } -} - QStringList DeckList::getCardList() const { - QSet result; - getCardListHelper(root, result); - return result.values(); + auto nodes = getCardNodes(); + + QStringList result; + std::transform(nodes.cbegin(), nodes.cend(), std::back_inserter(result), [](auto node) { return node->getName(); }); + + return result; } QList DeckList::getCardRefList() const { + auto nodes = getCardNodes(); + QList result; - getCardRefListHelper(root, result); + std::transform(nodes.cbegin(), nodes.cend(), std::back_inserter(result), + [](auto node) { return node->toCardRef(); }); + return result; } -QList DeckList::getCardNodes(const QStringList &restrictToZones) const +QList DeckList::getCardNodes(const QStringList &restrictToZones) const { - QList result; + QList result; - for (auto *node : *root) { - auto *zoneNode = dynamic_cast(node); - if (zoneNode == nullptr) { - continue; - } - if (!restrictToZones.isEmpty() && !restrictToZones.contains(node->getName())) { + auto zoneNodes = getZoneNodes(); + for (auto *zoneNode : zoneNodes) { + if (!restrictToZones.isEmpty() && !restrictToZones.contains(zoneNode->getName())) { continue; } for (auto *cardNode : *zoneNode) { @@ -586,20 +564,28 @@ QList DeckList::getCardNodes(const QStringList &restrictToZo return result; } +QList DeckList::getZoneNodes() const +{ + QList zones; + for (auto *node : *root) { + InnerDecklistNode *currentZone = dynamic_cast(node); + if (!currentZone) + continue; + zones.append(currentZone); + } + + return zones; +} + 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; } @@ -665,26 +651,23 @@ bool DeckList::deleteNode(AbstractDecklistNode *node, InnerDecklistNode *rootNod return false; } -static QString computeDeckHash(const InnerDecklistNode *root) +static QString computeDeckHash(const DeckList &deckList) { - QStringList cardList; - QSet hashZones, optionalZones; + auto mainDeckNodes = deckList.getCardNodes({DECK_ZONE_MAIN}); + auto sideDeckNodes = deckList.getCardNodes({DECK_ZONE_SIDE}); - 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++) { - 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()); - } + static auto nodesToCardList = [](const QList &nodes, const QString &prefix = {}) { + QStringList result; + for (auto node : nodes) { + for (int i = 0; i < node->getNumber(); ++i) { + result.append(prefix + node->getName().toLower()); } } - } + return result; + }; + + QStringList cardList = nodesToCardList(mainDeckNodes) + nodesToCardList(sideDeckNodes, "SB:"); + cardList.sort(); QByteArray deckHashArray = QCryptographicHash::hash(cardList.join(";").toUtf8(), QCryptographicHash::Sha1); quint64 number = (((quint64)(unsigned char)deckHashArray[0]) << 32) + @@ -706,7 +689,7 @@ QString DeckList::getDeckHash() const return cachedDeckHash; } - cachedDeckHash = computeDeckHash(root); + cachedDeckHash = computeDeckHash(*this); return cachedDeckHash; } diff --git a/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.h b/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.h index d4d1204e6..6f90b6b14 100644 --- a/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.h +++ b/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.h @@ -148,8 +148,6 @@ private: mutable QString cachedDeckHash; // Helpers for traversing the tree - static void getCardListHelper(InnerDecklistNode *node, QSet &result); - static void getCardRefListHelper(InnerDecklistNode *item, QList &result); InnerDecklistNode *getZoneObjFromName(const QString &zoneName); public: @@ -267,7 +265,8 @@ public: } QStringList getCardList() const; QList getCardRefList() const; - QList getCardNodes(const QStringList &restrictToZones = QStringList()) const; + QList getCardNodes(const QStringList &restrictToZones = QStringList()) const; + QList getZoneNodes() const; int getSideboardSize() const; InnerDecklistNode *getRoot() const { 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) {