diff --git a/cockatrice/src/game_graphics/deckview/deck_view.cpp b/cockatrice/src/game_graphics/deckview/deck_view.cpp index 1278737a0..de7726c0f 100644 --- a/cockatrice/src/game_graphics/deckview/deck_view.cpp +++ b/cockatrice/src/game_graphics/deckview/deck_view.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -381,18 +382,25 @@ void DeckViewScene::rebuildTree() addItem(container); } - for (int j = 0; j < currentZone->size(); j++) { - auto *currentCard = dynamic_cast(currentZone->at(j)); - if (!currentCard) { - continue; + // Cards in custom zones nested under a board are regular board cards in-game. + // They are collected recursively and reported with the top-level board zone + // as their origin, so that sideboard plans keep working. + std::function addZoneCards = [&addZoneCards, container, currentZone, + this](const InnerDecklistNode *zone) { + for (int j = 0; j < zone->size(); j++) { + auto *currentCard = dynamic_cast(zone->at(j)); + if (currentCard) { + for (int k = 0; k < currentCard->getNumber(); ++k) { + auto *newCard = new DeckViewCard(container, currentCard->toCardRef(), currentZone->getName()); + container->addCard(newCard); + emit newCardAdded(newCard); + } + } else if (auto *innerZone = dynamic_cast(zone->at(j))) { + addZoneCards(innerZone); + } } - - for (int k = 0; k < currentCard->getNumber(); ++k) { - auto *newCard = new DeckViewCard(container, currentCard->toCardRef(), currentZone->getName()); - container->addCard(newCard); - emit newCardAdded(newCard); - } - } + }; + addZoneCards(currentZone); } }