From aea52a4857bcc5929582e16ffcc31c69346ccc46 Mon Sep 17 00:00:00 2001 From: Zach Halpern Date: Mon, 25 Nov 2024 09:06:37 -0500 Subject: [PATCH] Support Flip Cards with related art --- cockatrice/src/client/tabs/tab_game.cpp | 4 ++-- cockatrice/src/client/tabs/tab_game.h | 2 +- cockatrice/src/game/cards/card_database.cpp | 19 ++++++++++++++++ cockatrice/src/game/cards/card_database.h | 1 + cockatrice/src/game/player/player.cpp | 25 ++++++++++++++++----- common/pb/command_create_token.proto | 2 ++ common/pb/event_create_token.proto | 1 + common/server_player.cpp | 6 +++-- 8 files changed, 50 insertions(+), 10 deletions(-) diff --git a/cockatrice/src/client/tabs/tab_game.cpp b/cockatrice/src/client/tabs/tab_game.cpp index a37e05567..76dd82ff5 100644 --- a/cockatrice/src/client/tabs/tab_game.cpp +++ b/cockatrice/src/client/tabs/tab_game.cpp @@ -1807,9 +1807,9 @@ void TabGame::createDeckViewContainerWidget(bool bReplay) deckViewContainerWidget->setLayout(deckViewContainerLayout); } -void TabGame::viewCardInfo(const QString &cardName) +void TabGame::viewCardInfo(const QString &cardName, const QString &providerId) const { - cardInfoFrameWidget->setCard(cardName); + cardInfoFrameWidget->setCard(cardName, providerId); } void TabGame::createCardInfoDock(bool bReplay) diff --git a/cockatrice/src/client/tabs/tab_game.h b/cockatrice/src/client/tabs/tab_game.h index 0d9d1d0db..3d8ebaa70 100644 --- a/cockatrice/src/client/tabs/tab_game.h +++ b/cockatrice/src/client/tabs/tab_game.h @@ -313,7 +313,7 @@ public: public slots: void sendGameCommand(PendingCommand *pend, int playerId = -1); void sendGameCommand(const ::google::protobuf::Message &command, int playerId = -1); - void viewCardInfo(const QString &cardName); + void viewCardInfo(const QString &cardName, const QString &providerId = "") const; }; #endif diff --git a/cockatrice/src/game/cards/card_database.cpp b/cockatrice/src/game/cards/card_database.cpp index 9df5d95e3..74492dfcb 100644 --- a/cockatrice/src/game/cards/card_database.cpp +++ b/cockatrice/src/game/cards/card_database.cpp @@ -707,6 +707,25 @@ bool CardDatabase::isProviderIdForPreferredPrinting(const QString &cardName, con return providerId == getPreferredPrintingProviderIdForCard(cardName); } +CardInfoPerSet CardDatabase::getSetInfoForCard(const CardInfoPtr &_card) +{ + const CardInfoPerSetMap &setMap = _card->getSets(); + if (setMap.empty()) { + return CardInfoPerSet(nullptr); + } + + for (const auto &x : setMap) { + for (auto &cardInfoForSet : x) { + if (QLatin1String("card_") + _card->getName() + QString("_") + cardInfoForSet.getProperty("uuid") == + _card->getPixmapCacheKey()) { + return cardInfoForSet; + } + } + } + + return CardInfoPerSet(nullptr); +} + void CardDatabase::refreshCachedReverseRelatedCards() { for (const CardInfoPtr &card : cards) diff --git a/cockatrice/src/game/cards/card_database.h b/cockatrice/src/game/cards/card_database.h index 7c7bef1da..bd5690894 100644 --- a/cockatrice/src/game/cards/card_database.h +++ b/cockatrice/src/game/cards/card_database.h @@ -487,6 +487,7 @@ public: CardSetPtr getSet(const QString &setName); bool isProviderIdForPreferredPrinting(const QString &cardName, const QString &providerId); + static CardInfoPerSet getSetInfoForCard(const CardInfoPtr &_card); QList getCardList() const { return cards.values(); diff --git a/cockatrice/src/game/player/player.cpp b/cockatrice/src/game/player/player.cpp index 869abecb2..349e0e562 100644 --- a/cockatrice/src/game/player/player.cpp +++ b/cockatrice/src/game/player/player.cpp @@ -1740,7 +1740,8 @@ void Player::actCreateRelatedCard() * then let's allow it to be created via "create another token" */ if (createRelatedFromRelation(sourceCard, cardRelation) && cardRelation->getCanCreateAnother()) { - CardInfoPtr cardInfo = CardDatabaseManager::getInstance()->getCard(cardRelation->getName()); + CardInfoPtr cardInfo = CardDatabaseManager::getInstance()->getCardByNameAndProviderId( + cardRelation->getName(), sourceCard->getProviderId()); setLastToken(cardInfo); } } @@ -1903,11 +1904,13 @@ void Player::createCard(const CardItem *sourceCard, case CardRelation::AttachTo: cmd.set_target_card_id(sourceCard->getId()); cmd.set_target_mode(Command_CreateToken::ATTACH_TO); + cmd.set_card_provider_id(sourceCard->getProviderId().toStdString()); break; case CardRelation::TransformInto: cmd.set_target_card_id(sourceCard->getId()); cmd.set_target_mode(Command_CreateToken::TRANSFORM_INTO); + cmd.set_card_provider_id(sourceCard->getProviderId().toStdString()); break; } @@ -2066,7 +2069,8 @@ void Player::eventCreateToken(const Event_CreateToken &event) return; } - CardItem *card = new CardItem(this, nullptr, QString::fromStdString(event.card_name()), QString(), event.card_id()); + CardItem *card = new CardItem(this, nullptr, QString::fromStdString(event.card_name()), + QString::fromStdString(event.card_provider_id()), event.card_id()); // use db PT if not provided in event if (!QString::fromStdString(event.pt()).isEmpty()) { card->setPT(QString::fromStdString(event.pt())); @@ -3712,13 +3716,17 @@ void Player::addRelatedCardView(const CardItem *card, QMenu *cardMenu) return; } + const auto ¤tCardSet = CardDatabase::getSetInfoForCard(cardInfo); + cardMenu->addSeparator(); auto viewRelatedCards = new QMenu(tr("View related cards")); cardMenu->addMenu(viewRelatedCards); for (const CardRelation *relatedCard : relatedCards) { QString relatedCardName = relatedCard->getName(); QAction *viewCard = viewRelatedCards->addAction(relatedCardName); - connect(viewCard, &QAction::triggered, game, [this, relatedCardName] { game->viewCardInfo(relatedCardName); }); + connect(viewCard, &QAction::triggered, game, [this, relatedCardName, currentCardSet] { + game->viewCardInfo(relatedCardName, currentCardSet.getProperty("uuid")); + }); } } @@ -3737,13 +3745,20 @@ void Player::addRelatedCardActions(const CardItem *card, QMenu *cardMenu) return; } + const auto ¤tCardSet = CardDatabase::getSetInfoForCard(cardInfo); + cardMenu->addSeparator(); int index = 0; QAction *createRelatedCards = nullptr; for (const CardRelation *cardRelation : relatedCards) { - CardInfoPtr relatedCard = CardDatabaseManager::getInstance()->getCard(cardRelation->getName()); - if (relatedCard == nullptr) + CardInfoPtr relatedCard = CardDatabaseManager::getInstance()->getCardByNameAndProviderId( + cardRelation->getName(), currentCardSet.getProperty("uuid")); + if (relatedCard == nullptr) { + relatedCard = CardDatabaseManager::getInstance()->getCard(cardRelation->getName()); + } + if (relatedCard == nullptr) { continue; + } QString relatedCardName; if (relatedCard->getPowTough().size() > 0) { diff --git a/common/pb/command_create_token.proto b/common/pb/command_create_token.proto index 4ee60b289..671ce3fe3 100644 --- a/common/pb/command_create_token.proto +++ b/common/pb/command_create_token.proto @@ -25,4 +25,6 @@ message Command_CreateToken { // What to do with the target card. Ignored if there is no target card. optional TargetMode target_mode = 11; + + optional string card_provider_id = 12; } diff --git a/common/pb/event_create_token.proto b/common/pb/event_create_token.proto index 42c32eff8..bc88a744c 100644 --- a/common/pb/event_create_token.proto +++ b/common/pb/event_create_token.proto @@ -14,4 +14,5 @@ message Event_CreateToken { optional bool destroy_on_zone_change = 7; optional sint32 x = 8; optional sint32 y = 9; + optional string card_provider_id = 10; } diff --git a/common/server_player.cpp b/common/server_player.cpp index adf1a66e0..218ab2fdd 100644 --- a/common/server_player.cpp +++ b/common/server_player.cpp @@ -391,6 +391,7 @@ static Event_CreateToken makeCreateTokenEvent(Server_CardZone *zone, Server_Card event.set_zone_name(zone->getName().toStdString()); event.set_card_id(card->getId()); event.set_card_name(card->getName().toStdString()); + event.set_card_provider_id(card->getProviderId().toStdString()); event.set_color(card->getColor().toStdString()); event.set_pt(card->getPT().toStdString()); event.set_annotation(card->getAnnotation().toStdString()); @@ -1400,7 +1401,8 @@ Server_Player::cmdCreateToken(const Command_CreateToken &cmd, ResponseContainer } } - QString cardName = nameFromStdString(cmd.card_name()); + const QString cardName = nameFromStdString(cmd.card_name()); + const QString cardProviderId = nameFromStdString(cmd.card_provider_id()); if (zone->hasCoords()) { xCoord = zone->getFreeGridColumn(xCoord, yCoord, cardName, false); } @@ -1411,7 +1413,7 @@ Server_Player::cmdCreateToken(const Command_CreateToken &cmd, ResponseContainer yCoord = 0; } - auto *card = new Server_Card(cardName, QString(), newCardId(), xCoord, yCoord); + auto *card = new Server_Card(cardName, cardProviderId, newCardId(), xCoord, yCoord); card->moveToThread(thread()); card->setPT(nameFromStdString(cmd.pt())); card->setColor(nameFromStdString(cmd.color()));