From 47c9a03beee8f8f91d94cefcea6bf78ca3f545da Mon Sep 17 00:00:00 2001 From: RickyRister Date: Sat, 12 Jul 2025 02:49:38 -0700 Subject: [PATCH] card_ref.h --- .../client/tabs/abstract_tab_deck_editor.cpp | 2 +- cockatrice/src/client/tabs/tab_game.cpp | 2 +- .../src/game/deckview/deck_view_container.cpp | 2 +- common/card_ref.h | 24 +++++++++++++++++++ common/decklist.cpp | 20 ++++++++-------- common/decklist.h | 18 +++++++++----- common/server_card.cpp | 16 ++++--------- common/server_card.h | 21 ++++++++-------- common/server_player.cpp | 6 ++--- 9 files changed, 66 insertions(+), 45 deletions(-) create mode 100644 common/card_ref.h diff --git a/cockatrice/src/client/tabs/abstract_tab_deck_editor.cpp b/cockatrice/src/client/tabs/abstract_tab_deck_editor.cpp index 38a89fd02..e04207160 100644 --- a/cockatrice/src/client/tabs/abstract_tab_deck_editor.cpp +++ b/cockatrice/src/client/tabs/abstract_tab_deck_editor.cpp @@ -162,7 +162,7 @@ void AbstractTabDeckEditor::setDeck(DeckLoader *_deck) { deckDockWidget->setDeck(_deck); PictureLoader::cacheCardPixmaps( - CardDatabaseManager::getInstance()->getCardsByNameAndProviderId(getDeckList()->getCardListWithProviderId())); + CardDatabaseManager::getInstance()->getCardsByNameAndProviderId(getDeckList()->getCardRefList())); setModified(false); // If they load a deck, make the deck list appear diff --git a/cockatrice/src/client/tabs/tab_game.cpp b/cockatrice/src/client/tabs/tab_game.cpp index 40c25067c..214e2b3ce 100644 --- a/cockatrice/src/client/tabs/tab_game.cpp +++ b/cockatrice/src/client/tabs/tab_game.cpp @@ -930,7 +930,7 @@ void TabGame::eventGameStateChanged(const Event_GameStateChanged &event, if (playerInfo.has_deck_list()) { DeckLoader newDeck(QString::fromStdString(playerInfo.deck_list())); PictureLoader::cacheCardPixmaps(CardDatabaseManager::getInstance()->getCardsByNameAndProviderId( - newDeck.getCardListWithProviderId())); + newDeck.getCardRefList())); deckViewContainer->setDeck(newDeck); player->setDeck(newDeck); } diff --git a/cockatrice/src/game/deckview/deck_view_container.cpp b/cockatrice/src/game/deckview/deck_view_container.cpp index a5552da44..f49c3ed19 100644 --- a/cockatrice/src/game/deckview/deck_view_container.cpp +++ b/cockatrice/src/game/deckview/deck_view_container.cpp @@ -333,7 +333,7 @@ void DeckViewContainer::deckSelectFinished(const Response &r) const Response_DeckDownload &resp = r.GetExtension(Response_DeckDownload::ext); DeckLoader newDeck(QString::fromStdString(resp.deck())); PictureLoader::cacheCardPixmaps( - CardDatabaseManager::getInstance()->getCardsByNameAndProviderId(newDeck.getCardListWithProviderId())); + CardDatabaseManager::getInstance()->getCardsByNameAndProviderId(newDeck.getCardRefList())); setDeck(newDeck); switchToDeckLoadedView(); } diff --git a/common/card_ref.h b/common/card_ref.h new file mode 100644 index 000000000..d29eee0bb --- /dev/null +++ b/common/card_ref.h @@ -0,0 +1,24 @@ +#ifndef CARD_REF_H +#define CARD_REF_H + +#include + +/** + * The information passed over the server that is required to identify the exact card to display. + * + * @param name The name of the card. Should not be empty, unless to indicate the lack of a card. + * @param providerId Determines which printing of the card to use. Can be empty, in which case Cockatrice should default + * to using the preferred set. + */ +struct CardRef +{ + QString name; + QString providerId = QString(); + + bool operator==(const CardRef &other) const + { + return name == other.name && providerId == other.providerId; + } +}; + +#endif // CARD_REF_H diff --git a/common/decklist.cpp b/common/decklist.cpp index a9a825592..8efdeb572 100644 --- a/common/decklist.cpp +++ b/common/decklist.cpp @@ -424,7 +424,7 @@ bool DeckList::readElement(QXmlStreamReader *xml) } else if (childName == "bannerCard") { QString providerId = xml->attributes().value("providerId").toString(); QString cardName = xml->readElementText(); - bannerCard = QPair(cardName, providerId); + bannerCard = {cardName, providerId}; } else if (childName == "tags") { tags.clear(); // Clear existing tags while (xml->readNextStartElement()) { @@ -456,8 +456,8 @@ void DeckList::write(QXmlStreamWriter *xml) const xml->writeTextElement("lastLoadedTimestamp", lastLoadedTimestamp); xml->writeTextElement("deckname", name); xml->writeStartElement("bannerCard"); - xml->writeAttribute("providerId", bannerCard.second); - xml->writeCharacters(bannerCard.first); + xml->writeAttribute("providerId", bannerCard.providerId); + xml->writeCharacters(bannerCard.name); xml->writeEndElement(); xml->writeTextElement("comments", comments); @@ -805,7 +805,7 @@ void DeckList::cleanList(bool preserveMetadata) refreshDeckHash(); } -void DeckList::getCardListHelper(InnerDecklistNode *item, QSet &result) const +void DeckList::getCardListHelper(InnerDecklistNode *item, QSet &result) { for (int i = 0; i < item->size(); ++i) { auto *node = dynamic_cast(item->at(i)); @@ -818,15 +818,15 @@ void DeckList::getCardListHelper(InnerDecklistNode *item, QSet &result) } } -void DeckList::getCardListWithProviderIdHelper(InnerDecklistNode *item, QMap &result) const +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.insert(node->getName(), node->getCardProviderId()); + result.append(node->toCardRef()); } else { - getCardListWithProviderIdHelper(dynamic_cast(item->at(i)), result); + getCardRefListHelper(dynamic_cast(item->at(i)), result); } } } @@ -838,10 +838,10 @@ QStringList DeckList::getCardList() const return result.values(); } -QMap DeckList::getCardListWithProviderId() const +QList DeckList::getCardRefList() const { - QMap result; - getCardListWithProviderIdHelper(root, result); + QList result; + getCardRefListHelper(root, result); return result; } diff --git a/common/decklist.h b/common/decklist.h index d7ed4add4..5e90ab180 100644 --- a/common/decklist.h +++ b/common/decklist.h @@ -1,6 +1,8 @@ #ifndef DECKLIST_H #define DECKLIST_H +#include "card_ref.h" + #include #include @@ -246,6 +248,10 @@ public: { return false; } + CardRef toCardRef() const + { + return {name, cardProviderId}; + } }; class DeckList : public QObject @@ -253,13 +259,13 @@ class DeckList : public QObject Q_OBJECT private: QString name, comments; - QPair bannerCard; + CardRef bannerCard; QString lastLoadedTimestamp; QStringList tags; QMap sideboardPlans; InnerDecklistNode *root; - void getCardListHelper(InnerDecklistNode *node, QSet &result) const; - void getCardListWithProviderIdHelper(InnerDecklistNode *item, QMap &result) const; + static void getCardListHelper(InnerDecklistNode *node, QSet &result); + static void getCardRefListHelper(InnerDecklistNode *item, QList &result); InnerDecklistNode *getZoneObjFromName(const QString &zoneName); /** @@ -305,7 +311,7 @@ public slots: tags.clear(); emit deckTagsChanged(); } - void setBannerCard(const QPair &_bannerCard = QPair()) + void setBannerCard(const CardRef &_bannerCard = {}) { bannerCard = _bannerCard; } @@ -331,7 +337,7 @@ public: { return tags; } - QPair getBannerCard() const + CardRef getBannerCard() const { return bannerCard; } @@ -365,7 +371,7 @@ public: return root->isEmpty() && name.isEmpty() && comments.isEmpty() && sideboardPlans.isEmpty(); } QStringList getCardList() const; - QMap getCardListWithProviderId() const; + QList getCardRefList() const; int getSideboardSize() const; diff --git a/common/server_card.cpp b/common/server_card.cpp index 0edbae937..323b4d827 100644 --- a/common/server_card.cpp +++ b/common/server_card.cpp @@ -27,15 +27,9 @@ #include -Server_Card::Server_Card(QString _name, - QString _provider_id, - int _id, - int _coord_x, - int _coord_y, - Server_CardZone *_zone) - : zone(_zone), id(_id), coord_x(_coord_x), coord_y(_coord_y), name(_name), provider_id(_provider_id), tapped(false), - attacking(false), facedown(false), color(), ptString(), annotation(), destroyOnZoneChange(false), - doesntUntap(false), parentCard(0), stashedCard(nullptr) +Server_Card::Server_Card(const CardRef &cardRef, int _id, int _coord_x, int _coord_y, Server_CardZone *_zone) + : zone(_zone), id(_id), coord_x(_coord_x), coord_y(_coord_y), cardRef(cardRef), tapped(false), attacking(false), + facedown(false), destroyOnZoneChange(false), doesntUntap(false), parentCard(0), stashedCard(nullptr) { } @@ -134,10 +128,10 @@ void Server_Card::setParentCard(Server_Card *_parentCard) void Server_Card::getInfo(ServerInfo_Card *info) { - QString displayedName = facedown ? QString() : name; + QString displayedName = facedown ? QString() : cardRef.name; info->set_id(id); - info->set_provider_id(provider_id.toStdString()); + info->set_provider_id(cardRef.providerId.toStdString()); info->set_name(displayedName.toStdString()); info->set_x(coord_x); info->set_y(coord_y); diff --git a/common/server_card.h b/common/server_card.h index 4529e08cd..519083a06 100644 --- a/common/server_card.h +++ b/common/server_card.h @@ -20,6 +20,7 @@ #ifndef SERVER_CARD_H #define SERVER_CARD_H +#include "card_ref.h" #include "pb/card_attributes.pb.h" #include "pb/serverinfo_card.pb.h" #include "server_arrowtarget.h" @@ -38,8 +39,7 @@ private: Server_CardZone *zone; int id; int coord_x, coord_y; - QString name; - QString provider_id; + CardRef cardRef; QMap counters; bool tapped; bool attacking; @@ -55,12 +55,7 @@ private: Server_Card *stashedCard; public: - Server_Card(QString _name, - QString _provider_id, - int _id, - int _coord_x, - int _coord_y, - Server_CardZone *_zone = nullptr); + Server_Card(const CardRef &cardRef, int _id, int _coord_x, int _coord_y, Server_CardZone *_zone = nullptr); ~Server_Card() override; Server_CardZone *getZone() const @@ -76,9 +71,13 @@ public: { return id; } + CardRef getCardRef() const + { + return cardRef; + } QString getProviderId() const { - return provider_id; + return cardRef.providerId; } int getX() const { @@ -90,7 +89,7 @@ public: } QString getName() const { - return name; + return cardRef.name; } const QMap &getCounters() const { @@ -152,7 +151,7 @@ public: } void setName(const QString &_name) { - name = _name; + cardRef.name = _name; } void setCounter(int _id, int value, Event_SetCardCounter *event = nullptr); void setTapped(bool _tapped) diff --git a/common/server_player.cpp b/common/server_player.cpp index 13a5405a6..989f7706e 100644 --- a/common/server_player.cpp +++ b/common/server_player.cpp @@ -210,9 +210,7 @@ void Server_Player::setupZones() continue; } for (int k = 0; k < currentCard->getNumber(); ++k) { - z->insertCard( - new Server_Card(currentCard->getName(), currentCard->getCardProviderId(), nextCardId++, 0, 0, z), - -1, 0); + z->insertCard(new Server_Card(currentCard->toCardRef(), nextCardId++, 0, 0, z), -1, 0); } } } @@ -1517,7 +1515,7 @@ Server_Player::cmdCreateToken(const Command_CreateToken &cmd, ResponseContainer yCoord = 0; } - auto *card = new Server_Card(cardName, cardProviderId, newCardId(), xCoord, yCoord); + auto *card = new Server_Card({cardName, cardProviderId}, newCardId(), xCoord, yCoord); card->moveToThread(thread()); // Client should already prevent face-down tokens from having attributes; this just an extra server-side check if (!cmd.face_down()) {