From f2cbdae829849dbb511bfcdcc3b8385acbddfef9 Mon Sep 17 00:00:00 2001 From: BruebachL <44814898+BruebachL@users.noreply.github.com> Date: Fri, 15 Aug 2025 07:10:36 +0200 Subject: [PATCH] Allow tokens to consider providerIds. (#6075) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tokens created through Ctrl + T use the pinned printing, if available. Tokens created through a related card menu use a token from the same set, if available. Took 2 hours 25 minutes Took 10 seconds Co-authored-by: Lukas BrĂ¼bach --- cockatrice/src/dialogs/dlg_create_token.cpp | 14 +++++++++++-- cockatrice/src/dialogs/dlg_create_token.h | 1 + cockatrice/src/game/cards/card_database.cpp | 6 ++++++ cockatrice/src/game/cards/card_database.h | 1 + cockatrice/src/game/player/player.cpp | 23 ++++++++++++++------- 5 files changed, 36 insertions(+), 9 deletions(-) diff --git a/cockatrice/src/dialogs/dlg_create_token.cpp b/cockatrice/src/dialogs/dlg_create_token.cpp index 2f37c7be6..064c77fa1 100644 --- a/cockatrice/src/dialogs/dlg_create_token.cpp +++ b/cockatrice/src/dialogs/dlg_create_token.cpp @@ -198,7 +198,16 @@ void DlgCreateToken::tokenSelectionChanged(const QModelIndex ¤t, const QMo annotationEdit->setText(""); } - pic->setCard(CardDatabaseManager::getInstance()->getPreferredCard(cardInfo)); + const auto &cardProviderId = + SettingsCache::instance().cardOverrides().getCardPreferenceOverride(cardInfo->getName()); + if (!cardProviderId.isEmpty()) { + CardRef ref; + ref.name = cardInfo->getName(); + ref.providerId = cardProviderId; + pic->setCard(CardDatabaseManager::getInstance()->getCard(ref)); + } else { + pic->setCard(CardDatabaseManager::getInstance()->getPreferredCard(cardInfo)); + } } void DlgCreateToken::updateSearchFieldWithoutUpdatingFilter(const QString &newValue) const @@ -250,5 +259,6 @@ TokenInfo DlgCreateToken::getTokenInfo() const .pt = ptEdit->text(), .annotation = annotationEdit->text(), .destroy = destroyCheckBox->isChecked(), - .faceDown = faceDownCheckBox->isChecked()}; + .faceDown = faceDownCheckBox->isChecked(), + .providerId = SettingsCache::instance().cardOverrides().getCardPreferenceOverride(nameEdit->text())}; } diff --git a/cockatrice/src/dialogs/dlg_create_token.h b/cockatrice/src/dialogs/dlg_create_token.h index cd1b48c81..df00e3d75 100644 --- a/cockatrice/src/dialogs/dlg_create_token.h +++ b/cockatrice/src/dialogs/dlg_create_token.h @@ -25,6 +25,7 @@ struct TokenInfo QString annotation; bool destroy = true; bool faceDown = false; + QString providerId; }; class DlgCreateToken : public QDialog diff --git a/cockatrice/src/game/cards/card_database.cpp b/cockatrice/src/game/cards/card_database.cpp index 884919308..f88cb497a 100644 --- a/cockatrice/src/game/cards/card_database.cpp +++ b/cockatrice/src/game/cards/card_database.cpp @@ -458,6 +458,12 @@ bool CardDatabase::isPreferredPrinting(const CardRef &cardRef) const return cardRef.providerId == getPreferredPrintingProviderId(cardRef.name); } +ExactCard CardDatabase::getCardFromSameSet(const QString &cardName, const PrintingInfo &otherPrinting) const +{ + PrintingInfo relatedPrinting = getSpecificPrinting(cardName, otherPrinting.getSet()->getCorrectedShortName(), ""); + return ExactCard(guessCard({cardName}).getCardPtr(), relatedPrinting); +} + 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 8b1b2926f..0654c7494 100644 --- a/cockatrice/src/game/cards/card_database.h +++ b/cockatrice/src/game/cards/card_database.h @@ -82,6 +82,7 @@ public: getSpecificPrinting(const QString &cardName, const QString &setShortName, const QString &collectorNumber) const; QString getPreferredPrintingProviderId(const QString &cardName) const; bool isPreferredPrinting(const CardRef &cardRef) const; + ExactCard getCardFromSameSet(const QString &cardName, const PrintingInfo &otherPrinting) const; [[nodiscard]] ExactCard guessCard(const CardRef &cardRef) const; diff --git a/cockatrice/src/game/player/player.cpp b/cockatrice/src/game/player/player.cpp index ecc2fa94f..776acfbf7 100644 --- a/cockatrice/src/game/player/player.cpp +++ b/cockatrice/src/game/player/player.cpp @@ -1840,7 +1840,8 @@ void Player::actCreateToken() lastTokenInfo = dlg.getTokenInfo(); - ExactCard correctedCard = CardDatabaseManager::getInstance()->guessCard({lastTokenInfo.name}); + ExactCard correctedCard = + CardDatabaseManager::getInstance()->guessCard({lastTokenInfo.name, lastTokenInfo.providerId}); if (correctedCard) { lastTokenInfo.name = correctedCard.getName(); lastTokenTableRow = TableZone::clampValidTableRow(2 - correctedCard.getInfo().getTableRow()); @@ -1863,6 +1864,7 @@ void Player::actCreateAnotherToken() Command_CreateToken cmd; cmd.set_zone("table"); cmd.set_card_name(lastTokenInfo.name.toStdString()); + cmd.set_card_provider_id(lastTokenInfo.providerId.toStdString()); cmd.set_color(lastTokenInfo.color.toStdString()); cmd.set_pt(lastTokenInfo.pt.toStdString()); cmd.set_annotation(lastTokenInfo.annotation.toStdString()); @@ -1903,9 +1905,9 @@ void Player::actCreateRelatedCard() * then let's allow it to be created via "create another token" */ if (createRelatedFromRelation(sourceCard, cardRelation) && cardRelation->getCanCreateAnother()) { - ExactCard cardInfo = - CardDatabaseManager::getInstance()->getCard({cardRelation->getName(), sourceCard->getProviderId()}); - setLastToken(cardInfo.getCardPtr()); + ExactCard relatedCard = CardDatabaseManager::getInstance()->getCardFromSameSet( + cardRelation->getName(), sourceCard->getCard().getPrinting()); + setLastToken(relatedCard.getCardPtr()); } } @@ -2067,13 +2069,18 @@ void Player::createCard(const CardItem *sourceCard, cmd.set_x(gridPoint.x()); cmd.set_y(gridPoint.y()); + ExactCard relatedCard = CardDatabaseManager::getInstance()->getCardFromSameSet(cardInfo->getName(), + sourceCard->getCard().getPrinting()); + switch (attachType) { case CardRelation::DoesNotAttach: cmd.set_target_zone("table"); + cmd.set_card_provider_id(relatedCard.getPrinting().getUuid().toStdString()); break; case CardRelation::AttachTo: cmd.set_target_zone("table"); // We currently only support creating tokens on the table + cmd.set_card_provider_id(relatedCard.getPrinting().getUuid().toStdString()); cmd.set_target_card_id(sourceCard->getId()); cmd.set_target_mode(Command_CreateToken::ATTACH_TO); break; @@ -4166,8 +4173,8 @@ void Player::addRelatedCardActions(const CardItem *card, QMenu *cardMenu) int index = 0; QAction *createRelatedCards = nullptr; for (const CardRelation *cardRelation : relatedCards) { - ExactCard relatedCard = - CardDatabaseManager::getInstance()->getCard({cardRelation->getName(), exactCard.getPrinting().getUuid()}); + ExactCard relatedCard = CardDatabaseManager::getInstance()->getCardFromSameSet(cardRelation->getName(), + card->getCard().getPrinting()); if (!relatedCard) { relatedCard = CardDatabaseManager::getInstance()->getCard({cardRelation->getName()}); } @@ -4307,7 +4314,9 @@ void Player::setLastToken(CardInfoPtr cardInfo) .color = cardInfo->getColors().isEmpty() ? QString() : cardInfo->getColors().left(1).toLower(), .pt = cardInfo->getPowTough(), .annotation = SettingsCache::instance().getAnnotateTokens() ? cardInfo->getText() : "", - .destroy = true}; + .destroy = true, + .providerId = + SettingsCache::instance().cardOverrides().getCardPreferenceOverride(cardInfo->getName())}; lastTokenTableRow = TableZone::clampValidTableRow(2 - cardInfo->getTableRow()); aCreateAnotherToken->setText(tr("C&reate another %1 token").arg(lastTokenInfo.name));