From c9690d790cb4e79f9164ce20ce069a9bafa63b8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Thu, 7 Nov 2024 08:47:04 +0100 Subject: [PATCH] Have various game events respect the new UUID attribute on instantiation. --- cockatrice/src/deck/deck_list_model.cpp | 23 ++++++++++++------- cockatrice/src/deck/deck_list_model.h | 9 +++++--- cockatrice/src/deck/deck_view.cpp | 2 +- .../src/game/cards/abstract_card_item.cpp | 9 +++++--- cockatrice/src/game/cards/card_item.cpp | 5 ++-- cockatrice/src/game/player/player.cpp | 3 ++- cockatrice/src/game/zones/card_zone.cpp | 2 +- cockatrice/src/game/zones/view_zone.cpp | 11 +++++---- common/decklist.cpp | 10 ++++++++ common/decklist.h | 1 + common/server_card.cpp | 1 + common/server_player.cpp | 8 +++++-- 12 files changed, 58 insertions(+), 26 deletions(-) diff --git a/cockatrice/src/deck/deck_list_model.cpp b/cockatrice/src/deck/deck_list_model.cpp index abfd66d8d..a70c36532 100644 --- a/cockatrice/src/deck/deck_list_model.cpp +++ b/cockatrice/src/deck/deck_list_model.cpp @@ -299,7 +299,7 @@ InnerDecklistNode *DeckListModel::createNodeIfNeeded(const QString &name, InnerD return newNode; } -DecklistModelCardNode *DeckListModel::findCardNode(const QString &cardName, const QString &zoneName) const +DecklistModelCardNode *DeckListModel::findCardNode(const QString &cardName, const QString &zoneName, const QString &uuid) const { InnerDecklistNode *zoneNode, *typeNode; CardInfoPtr info; @@ -321,14 +321,17 @@ DecklistModelCardNode *DeckListModel::findCardNode(const QString &cardName, cons return nullptr; } - return dynamic_cast(typeNode->findChild(cardName)); + if (uuid.isEmpty()) { + return dynamic_cast(typeNode->findChild(cardName)); + } + return dynamic_cast(typeNode->findChild(cardName, uuid)); } -QModelIndex DeckListModel::findCard(const QString &cardName, const QString &zoneName) const +QModelIndex DeckListModel::findCard(const QString &cardName, const QString &zoneName, const QString &uuid) const { DecklistModelCardNode *cardNode; - cardNode = findCardNode(cardName, zoneName); + cardNode = findCardNode(cardName, zoneName, uuid); if (!cardNode) { return {}; } @@ -336,10 +339,14 @@ QModelIndex DeckListModel::findCard(const QString &cardName, const QString &zone return nodeToIndex(cardNode); } -QModelIndex DeckListModel::addCard(const QString &cardName, const QString &zoneName, bool abAddAnyway) +QModelIndex DeckListModel::addPreferredPrintingCard(const QString &cardName, const QString &zoneName, bool abAddAnyway) { - CardInfoPtr cardInfo = CardDatabaseManager::getInstance()->getCard(cardName); - CardInfoPerSet cardInfoSet = CardDatabaseManager::getInstance()->getPreferredSetForCard(cardName); + return addCard(cardName, CardDatabaseManager::getInstance()->getPreferredSetForCard(cardName), zoneName, abAddAnyway); +} + +QModelIndex DeckListModel::addCard(const QString &cardName, const CardInfoPerSet cardInfoSet, const QString &zoneName, bool abAddAnyway) +{ + CardInfoPtr cardInfo = CardDatabaseManager::getInstance()->getCardByNameAndUUID(cardName, cardInfoSet.getProperty("uuid")); if (cardInfo == nullptr) { if (abAddAnyway) { @@ -359,7 +366,7 @@ QModelIndex DeckListModel::addCard(const QString &cardName, const QString &zoneN InnerDecklistNode *cardTypeNode = createNodeIfNeeded(cardType, zoneNode); const QModelIndex parentIndex = nodeToIndex(cardTypeNode); - auto *cardNode = dynamic_cast(cardTypeNode->findChild(cardName)); + auto *cardNode = dynamic_cast(cardTypeNode->findChild(cardName, cardInfoSet.getProperty("uuid"))); if (!cardNode) { auto *decklistCard = deckList->addCard( cardInfo->getName(), zoneName, cardInfoSet.getProperty("uuid"), cardInfoSet.getProperty("num")); diff --git a/cockatrice/src/deck/deck_list_model.h b/cockatrice/src/deck/deck_list_model.h index 423f4d613..e1ad1f0e2 100644 --- a/cockatrice/src/deck/deck_list_model.h +++ b/cockatrice/src/deck/deck_list_model.h @@ -2,6 +2,7 @@ #define DECKLISTMODEL_H #include "decklist.h" +#include "../game/cards/card_database.h" #include #include @@ -81,8 +82,10 @@ public: Qt::ItemFlags flags(const QModelIndex &index) const override; bool setData(const QModelIndex &index, const QVariant &value, int role) override; bool removeRows(int row, int count, const QModelIndex &parent) override; - QModelIndex findCard(const QString &cardName, const QString &zoneName) const; - QModelIndex addCard(const QString &cardName, const QString &zoneName, bool abAddAnyway = false); + QModelIndex findCard(const QString &cardName, const QString &zoneName, const QString &uuid = "") const; + QModelIndex addPreferredPrintingCard(const QString &cardName, const QString &zoneName, bool abAddAnyway); + QModelIndex + addCard(const ::QString &cardName, CardInfoPerSet cardInfoSet, const QString &zoneName, bool abAddAnyway = false); void sort(int column, Qt::SortOrder order) override; void cleanList(); DeckLoader *getDeckList() const @@ -98,7 +101,7 @@ private: Qt::SortOrder lastKnownOrder; InnerDecklistNode *createNodeIfNeeded(const QString &name, InnerDecklistNode *parent); QModelIndex nodeToIndex(AbstractDecklistNode *node) const; - DecklistModelCardNode *findCardNode(const QString &cardName, const QString &zoneName) const; + DecklistModelCardNode *findCardNode(const QString &cardName, const QString &zoneName, const QString &uuid = "") const; void emitRecursiveUpdates(const QModelIndex &index); void sortHelper(InnerDecklistNode *node, Qt::SortOrder order); diff --git a/cockatrice/src/deck/deck_view.cpp b/cockatrice/src/deck/deck_view.cpp index 6c730cae4..3e375f96e 100644 --- a/cockatrice/src/deck/deck_view.cpp +++ b/cockatrice/src/deck/deck_view.cpp @@ -354,7 +354,7 @@ void DeckViewScene::rebuildTree() continue; for (int k = 0; k < currentCard->getNumber(); ++k) { - DeckViewCard *newCard = new DeckViewCard(currentCard->getName(), currentZone->getName(), container); + DeckViewCard *newCard = new DeckViewCard(currentCard->getName(), currentCard->getCardUuid(), currentZone->getName(), container); container->addCard(newCard); emit newCardAdded(newCard); } diff --git a/cockatrice/src/game/cards/abstract_card_item.cpp b/cockatrice/src/game/cards/abstract_card_item.cpp index 90a13a46c..7908460ab 100644 --- a/cockatrice/src/game/cards/abstract_card_item.cpp +++ b/cockatrice/src/game/cards/abstract_card_item.cpp @@ -1,7 +1,6 @@ #include "abstract_card_item.h" #include "../../client/ui/picture_loader.h" -#include "../../main.h" #include "../../settings/cache_settings.h" #include "../game_scene.h" #include "card_database.h" @@ -13,7 +12,11 @@ #include #include -AbstractCardItem::AbstractCardItem(const QString &_name, const QString &_uuid, Player *_owner, int _id, QGraphicsItem *parent) +AbstractCardItem::AbstractCardItem(const QString &_name, + const QString &_uuid, + Player *_owner, + int _id, + QGraphicsItem *parent) : ArrowTarget(_owner, parent), id(_id), name(_name), uuid(_uuid), tapped(false), facedown(false), tapAngle(0), bgColor(Qt::transparent), isHovered(false), realZValue(0) { @@ -50,7 +53,7 @@ void AbstractCardItem::pixmapUpdated() void AbstractCardItem::cardInfoUpdated() { - info = CardDatabaseManager::getInstance()->getCard(name); + info = CardDatabaseManager::getInstance()->getCardByNameAndUUID(name, uuid); if (!info && !name.isEmpty()) { QVariantHash properties = QVariantHash(); diff --git a/cockatrice/src/game/cards/card_item.cpp b/cockatrice/src/game/cards/card_item.cpp index 2bf9920df..c08cadcd2 100644 --- a/cockatrice/src/game/cards/card_item.cpp +++ b/cockatrice/src/game/cards/card_item.cpp @@ -24,8 +24,8 @@ CardItem::CardItem(Player *_owner, bool _revealedCard, QGraphicsItem *parent, CardZone *_zone) - : AbstractCardItem(_name, _uuid, _owner, _cardid, parent), zone(_zone), revealedCard(_revealedCard), attacking(false), - destroyOnZoneChange(false), doesntUntap(false), dragItem(nullptr), attachedTo(nullptr) + : AbstractCardItem(_name, _uuid, _owner, _cardid, parent), zone(_zone), revealedCard(_revealedCard), + attacking(false), destroyOnZoneChange(false), doesntUntap(false), dragItem(nullptr), attachedTo(nullptr) { owner->addCard(this); @@ -243,6 +243,7 @@ void CardItem::processCardInfo(const ServerInfo_Card &_info) } setId(_info.id()); + setUUID(QString::fromStdString(_info.uuid())); setName(QString::fromStdString(_info.name())); setAttacking(_info.attacking()); setFaceDown(_info.face_down()); diff --git a/cockatrice/src/game/player/player.cpp b/cockatrice/src/game/player/player.cpp index f51006d4f..cb7705a2d 100644 --- a/cockatrice/src/game/player/player.cpp +++ b/cockatrice/src/game/player/player.cpp @@ -2031,7 +2031,7 @@ void Player::eventCreateToken(const Event_CreateToken &event) return; } - CardItem *card = new CardItem(this, QString::fromStdString(event.card_name()), event.card_id()); + CardItem *card = new CardItem(this, QString::fromStdString(event.card_name()), QString(), event.card_id()); // use db PT if not provided in event if (!QString::fromStdString(event.pt()).isEmpty()) { card->setPT(QString::fromStdString(event.pt())); @@ -2326,6 +2326,7 @@ void Player::eventDrawCards(const Event_DrawCards &event) for (int i = 0; i < listSize; ++i) { const ServerInfo_Card &cardInfo = event.cards(i); CardItem *card = _deck->takeCard(0, cardInfo.id()); + card->setUUID(QString::fromStdString(cardInfo.uuid())); card->setName(QString::fromStdString(cardInfo.name())); _hand->addCard(card, false, -1); } diff --git a/cockatrice/src/game/zones/card_zone.cpp b/cockatrice/src/game/zones/card_zone.cpp index b0e06f323..9bac9357e 100644 --- a/cockatrice/src/game/zones/card_zone.cpp +++ b/cockatrice/src/game/zones/card_zone.cpp @@ -126,7 +126,7 @@ void CardZone::addCard(CardItem *card, bool reorganize, int x, int y) { for (auto *view : views) { if ((x <= view->getCards().size()) || (view->getNumberCards() == -1)) { - view->addCard(new CardItem(player, card->getName(), card->getId()), reorganize, x, y); + view->addCard(new CardItem(player, card->getName(), card->getUUID(), card->getId()), reorganize, x, y); } } diff --git a/cockatrice/src/game/zones/view_zone.cpp b/cockatrice/src/game/zones/view_zone.cpp index 6cf6ad52e..78f305dc5 100644 --- a/cockatrice/src/game/zones/view_zone.cpp +++ b/cockatrice/src/game/zones/view_zone.cpp @@ -56,9 +56,9 @@ void ZoneViewZone::initializeCards(const QList &cardLis { if (!cardList.isEmpty()) { for (int i = 0; i < cardList.size(); ++i) - addCard( - new CardItem(player, QString::fromStdString(cardList[i]->name()), cardList[i]->id(), revealZone, this), - false, i); + addCard(new CardItem(player, QString::fromStdString(cardList[i]->name()), + QString::fromStdString(cardList[i]->uuid()), cardList[i]->id(), revealZone, this), + false, i); reorganizeCards(); } else if (!origZone->contentsKnown()) { Command_DumpZone cmd; @@ -75,7 +75,7 @@ void ZoneViewZone::initializeCards(const QList &cardLis int number = numberCards == -1 ? c.size() : (numberCards < c.size() ? numberCards : c.size()); for (int i = 0; i < number; i++) { CardItem *card = c.at(i); - addCard(new CardItem(player, card->getName(), card->getId(), revealZone, this), false, i); + addCard(new CardItem(player, card->getName(), card->getUUID(), card->getId(), revealZone, this), false, i); } reorganizeCards(); } @@ -88,7 +88,8 @@ void ZoneViewZone::zoneDumpReceived(const Response &r) for (int i = 0; i < respCardListSize; ++i) { const ServerInfo_Card &cardInfo = resp.zone_info().card_list(i); auto cardName = QString::fromStdString(cardInfo.name()); - auto *card = new CardItem(player, cardName, cardInfo.id(), revealZone, this, this); + auto cardUuid = QString::fromStdString(cardInfo.uuid()); + auto *card = new CardItem(player, cardName, cardUuid, cardInfo.id(), revealZone, this, this); cards.insert(i, card); } reorganizeCards(); diff --git a/common/decklist.cpp b/common/decklist.cpp index b78db6b43..09f952152 100644 --- a/common/decklist.cpp +++ b/common/decklist.cpp @@ -155,6 +155,16 @@ AbstractDecklistNode *InnerDecklistNode::findChild(const QString &_name) return nullptr; } +AbstractDecklistNode *InnerDecklistNode::findChild(const QString &_name, const QString &_uuid) +{ + for (int i = 0; i < size(); i++) { + if (at(i)->getName() == _name && at(i)->getCardUuid() == _uuid) { + return at(i); + } + } + return nullptr; +} + int InnerDecklistNode::height() const { return at(0)->height() + 1; diff --git a/common/decklist.h b/common/decklist.h index 69965b05a..923c2e258 100644 --- a/common/decklist.h +++ b/common/decklist.h @@ -128,6 +128,7 @@ public: void clearTree(); AbstractDecklistNode *findChild(const QString &_name); + AbstractDecklistNode *findChild(const QString &_name, const QString &_uuid); int height() const override; int recursiveCount(bool countTotalCards = false) const; bool compare(AbstractDecklistNode *other) const override; diff --git a/common/server_card.cpp b/common/server_card.cpp index 9d299dde0..30b0179d4 100644 --- a/common/server_card.cpp +++ b/common/server_card.cpp @@ -130,6 +130,7 @@ void Server_Card::getInfo(ServerInfo_Card *info) QString displayedName = facedown ? QString() : name; info->set_id(id); + info->set_uuid(uuid.toStdString()); info->set_name(displayedName.toStdString()); info->set_x(coord_x); info->set_y(coord_y); diff --git a/common/server_player.cpp b/common/server_player.cpp index 862705a7d..58512c6fe 100644 --- a/common/server_player.cpp +++ b/common/server_player.cpp @@ -209,7 +209,8 @@ void Server_Player::setupZones() continue; } for (int k = 0; k < currentCard->getNumber(); ++k) { - z->insertCard(new Server_Card(currentCard->getName(), nextCardId++, 0, 0, z), -1, 0); + z->insertCard( + new Server_Card(currentCard->getName(), currentCard->getCardUuid(), nextCardId++, 0, 0, z), -1, 0); } } } @@ -338,6 +339,7 @@ Response::ResponseCode Server_Player::drawCards(GameEventStorage &ges, int numbe ServerInfo_Card *cardInfo = eventPrivate.add_cards(); cardInfo->set_id(card->getId()); cardInfo->set_name(card->getName().toStdString()); + cardInfo->set_uuid(card->getUUID().toStdString()); } ges.enqueueGameEvent(eventPrivate, playerId, GameEventStorageItem::SendToPrivate, playerId); @@ -1406,7 +1408,7 @@ Server_Player::cmdCreateToken(const Command_CreateToken &cmd, ResponseContainer yCoord = 0; } - auto *card = new Server_Card(cardName, newCardId(), xCoord, yCoord); + auto *card = new Server_Card(cardName, QString(), newCardId(), xCoord, yCoord); card->moveToThread(thread()); card->setPT(nameFromStdString(cmd.pt())); card->setColor(nameFromStdString(cmd.color())); @@ -1941,6 +1943,7 @@ Server_Player::cmdDumpZone(const Command_DumpZone &cmd, ResponseContainer &rc, G Server_Card *card = cards[i]; QString displayedName = card->getFaceDown() ? QString() : card->getName(); ServerInfo_Card *cardInfo = zoneInfo->add_card_list(); + cardInfo->set_uuid(card->getUUID().toStdString()); cardInfo->set_name(displayedName.toStdString()); if (zone->getType() == ServerInfo_Zone::HiddenZone) { cardInfo->set_id(i); @@ -2058,6 +2061,7 @@ Server_Player::cmdRevealCards(const Command_RevealCards &cmd, ResponseContainer ServerInfo_Card *cardInfo = eventPrivate.add_cards(); cardInfo->set_id(card->getId()); + cardInfo->set_uuid(card->getUUID().toStdString()); cardInfo->set_name(card->getName().toStdString()); cardInfo->set_x(card->getX()); cardInfo->set_y(card->getY());