Support Flip Cards with related art

This commit is contained in:
Zach Halpern 2024-11-25 09:06:37 -05:00 committed by ZeldaZach
parent db53066d89
commit aea52a4857
No known key found for this signature in database
8 changed files with 50 additions and 10 deletions

View file

@ -1807,9 +1807,9 @@ void TabGame::createDeckViewContainerWidget(bool bReplay)
deckViewContainerWidget->setLayout(deckViewContainerLayout); 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) void TabGame::createCardInfoDock(bool bReplay)

View file

@ -313,7 +313,7 @@ public:
public slots: public slots:
void sendGameCommand(PendingCommand *pend, int playerId = -1); void sendGameCommand(PendingCommand *pend, int playerId = -1);
void sendGameCommand(const ::google::protobuf::Message &command, 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 #endif

View file

@ -707,6 +707,25 @@ bool CardDatabase::isProviderIdForPreferredPrinting(const QString &cardName, con
return providerId == getPreferredPrintingProviderIdForCard(cardName); 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() void CardDatabase::refreshCachedReverseRelatedCards()
{ {
for (const CardInfoPtr &card : cards) for (const CardInfoPtr &card : cards)

View file

@ -487,6 +487,7 @@ public:
CardSetPtr getSet(const QString &setName); CardSetPtr getSet(const QString &setName);
bool isProviderIdForPreferredPrinting(const QString &cardName, const QString &providerId); bool isProviderIdForPreferredPrinting(const QString &cardName, const QString &providerId);
static CardInfoPerSet getSetInfoForCard(const CardInfoPtr &_card);
QList<CardInfoPtr> getCardList() const QList<CardInfoPtr> getCardList() const
{ {
return cards.values(); return cards.values();

View file

@ -1740,7 +1740,8 @@ void Player::actCreateRelatedCard()
* then let's allow it to be created via "create another token" * then let's allow it to be created via "create another token"
*/ */
if (createRelatedFromRelation(sourceCard, cardRelation) && cardRelation->getCanCreateAnother()) { if (createRelatedFromRelation(sourceCard, cardRelation) && cardRelation->getCanCreateAnother()) {
CardInfoPtr cardInfo = CardDatabaseManager::getInstance()->getCard(cardRelation->getName()); CardInfoPtr cardInfo = CardDatabaseManager::getInstance()->getCardByNameAndProviderId(
cardRelation->getName(), sourceCard->getProviderId());
setLastToken(cardInfo); setLastToken(cardInfo);
} }
} }
@ -1903,11 +1904,13 @@ void Player::createCard(const CardItem *sourceCard,
case CardRelation::AttachTo: case CardRelation::AttachTo:
cmd.set_target_card_id(sourceCard->getId()); cmd.set_target_card_id(sourceCard->getId());
cmd.set_target_mode(Command_CreateToken::ATTACH_TO); cmd.set_target_mode(Command_CreateToken::ATTACH_TO);
cmd.set_card_provider_id(sourceCard->getProviderId().toStdString());
break; break;
case CardRelation::TransformInto: case CardRelation::TransformInto:
cmd.set_target_card_id(sourceCard->getId()); cmd.set_target_card_id(sourceCard->getId());
cmd.set_target_mode(Command_CreateToken::TRANSFORM_INTO); cmd.set_target_mode(Command_CreateToken::TRANSFORM_INTO);
cmd.set_card_provider_id(sourceCard->getProviderId().toStdString());
break; break;
} }
@ -2066,7 +2069,8 @@ void Player::eventCreateToken(const Event_CreateToken &event)
return; 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 // use db PT if not provided in event
if (!QString::fromStdString(event.pt()).isEmpty()) { if (!QString::fromStdString(event.pt()).isEmpty()) {
card->setPT(QString::fromStdString(event.pt())); card->setPT(QString::fromStdString(event.pt()));
@ -3712,13 +3716,17 @@ void Player::addRelatedCardView(const CardItem *card, QMenu *cardMenu)
return; return;
} }
const auto &currentCardSet = CardDatabase::getSetInfoForCard(cardInfo);
cardMenu->addSeparator(); cardMenu->addSeparator();
auto viewRelatedCards = new QMenu(tr("View related cards")); auto viewRelatedCards = new QMenu(tr("View related cards"));
cardMenu->addMenu(viewRelatedCards); cardMenu->addMenu(viewRelatedCards);
for (const CardRelation *relatedCard : relatedCards) { for (const CardRelation *relatedCard : relatedCards) {
QString relatedCardName = relatedCard->getName(); QString relatedCardName = relatedCard->getName();
QAction *viewCard = viewRelatedCards->addAction(relatedCardName); 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; return;
} }
const auto &currentCardSet = CardDatabase::getSetInfoForCard(cardInfo);
cardMenu->addSeparator(); cardMenu->addSeparator();
int index = 0; int index = 0;
QAction *createRelatedCards = nullptr; QAction *createRelatedCards = nullptr;
for (const CardRelation *cardRelation : relatedCards) { for (const CardRelation *cardRelation : relatedCards) {
CardInfoPtr relatedCard = CardDatabaseManager::getInstance()->getCard(cardRelation->getName()); CardInfoPtr relatedCard = CardDatabaseManager::getInstance()->getCardByNameAndProviderId(
if (relatedCard == nullptr) cardRelation->getName(), currentCardSet.getProperty("uuid"));
if (relatedCard == nullptr) {
relatedCard = CardDatabaseManager::getInstance()->getCard(cardRelation->getName());
}
if (relatedCard == nullptr) {
continue; continue;
}
QString relatedCardName; QString relatedCardName;
if (relatedCard->getPowTough().size() > 0) { if (relatedCard->getPowTough().size() > 0) {

View file

@ -25,4 +25,6 @@ message Command_CreateToken {
// What to do with the target card. Ignored if there is no target card. // What to do with the target card. Ignored if there is no target card.
optional TargetMode target_mode = 11; optional TargetMode target_mode = 11;
optional string card_provider_id = 12;
} }

View file

@ -14,4 +14,5 @@ message Event_CreateToken {
optional bool destroy_on_zone_change = 7; optional bool destroy_on_zone_change = 7;
optional sint32 x = 8; optional sint32 x = 8;
optional sint32 y = 9; optional sint32 y = 9;
optional string card_provider_id = 10;
} }

View file

@ -391,6 +391,7 @@ static Event_CreateToken makeCreateTokenEvent(Server_CardZone *zone, Server_Card
event.set_zone_name(zone->getName().toStdString()); event.set_zone_name(zone->getName().toStdString());
event.set_card_id(card->getId()); event.set_card_id(card->getId());
event.set_card_name(card->getName().toStdString()); event.set_card_name(card->getName().toStdString());
event.set_card_provider_id(card->getProviderId().toStdString());
event.set_color(card->getColor().toStdString()); event.set_color(card->getColor().toStdString());
event.set_pt(card->getPT().toStdString()); event.set_pt(card->getPT().toStdString());
event.set_annotation(card->getAnnotation().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()) { if (zone->hasCoords()) {
xCoord = zone->getFreeGridColumn(xCoord, yCoord, cardName, false); xCoord = zone->getFreeGridColumn(xCoord, yCoord, cardName, false);
} }
@ -1411,7 +1413,7 @@ Server_Player::cmdCreateToken(const Command_CreateToken &cmd, ResponseContainer
yCoord = 0; 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->moveToThread(thread());
card->setPT(nameFromStdString(cmd.pt())); card->setPT(nameFromStdString(cmd.pt()));
card->setColor(nameFromStdString(cmd.color())); card->setColor(nameFromStdString(cmd.color()));