ability to directly attach from other zones (#5250)

* add attach and draw arrow actions to more card menus

* implement attaching from other zones

* disallow attaching from deck

* do nothing if target is already attached

* add null check
This commit is contained in:
RickyRister 2024-12-17 20:38:22 -08:00 committed by GitHub
parent c9d5d5609c
commit 03db4ccce6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 89 additions and 13 deletions

View file

@ -2666,6 +2666,46 @@ void Player::playCard(CardItem *card, bool faceDown, bool tapped)
sendGameCommand(cmd);
}
/**
* Like {@link Player::playCard}, but forces the card to be played to the table zone.
* Cards with tablerow 3 (the stack) will be played to tablerow 1 (the noncreatures row).
*/
void Player::playCardToTable(CardItem *card, bool faceDown, bool tapped)
{
if (card == nullptr) {
return;
}
Command_MoveCard cmd;
cmd.set_start_player_id(card->getZone()->getPlayer()->getId());
cmd.set_start_zone(card->getZone()->getName().toStdString());
cmd.set_target_player_id(getId());
CardToMove *cardToMove = cmd.mutable_cards_to_move()->add_card();
cardToMove->set_card_id(card->getId());
CardInfoPtr info = card->getInfo();
if (!info) {
return;
}
int tableRow = faceDown ? 2 : info->getTableRow();
// default instant/sorcery cards to the noncreatures row
if (tableRow > 2) {
tableRow = 1;
}
QPoint gridPoint = QPoint(-1, TableZone::clampValidTableRow(2 - tableRow));
cardToMove->set_face_down(faceDown);
if (!faceDown) {
cardToMove->set_pt(info->getPowTough().toStdString());
}
cardToMove->set_tapped(faceDown ? false : tapped);
cmd.set_target_zone("table");
cmd.set_x(gridPoint.x());
cmd.set_y(gridPoint.y());
sendGameCommand(cmd);
}
void Player::addCard(CardItem *card)
{
emit newCardAdded(card);
@ -3635,6 +3675,7 @@ void Player::updateCardMenu(const CardItem *card)
cardMenu->addSeparator();
} else if (card->getZone()->getName() == "stack") {
// Card is on the stack
cardMenu->addAction(aAttach);
cardMenu->addAction(aDrawArrow);
cardMenu->addSeparator();
cardMenu->addAction(aClone);
@ -3649,12 +3690,17 @@ void Player::updateCardMenu(const CardItem *card)
cardMenu->addAction(aSelectAll);
cardMenu->addAction(aPlay);
cardMenu->addAction(aPlayFacedown);
cardMenu->addSeparator();
cardMenu->addAction(aClone);
cardMenu->addMenu(moveMenu);
cardMenu->addSeparator();
cardMenu->addAction(aSelectAll);
cardMenu->addSeparator();
cardMenu->addAction(aAttach);
cardMenu->addAction(aDrawArrow);
addRelatedCardView(card, cardMenu);
addRelatedCardActions(card, cardMenu);
} else {
@ -3667,8 +3713,17 @@ void Player::updateCardMenu(const CardItem *card)
connect(revealMenu, &QMenu::triggered, this, &Player::actReveal);
cardMenu->addMenu(moveMenu);
// actions that are really wonky when done from deck or sideboard
if (card->getZone()->getName() == "hand") {
cardMenu->addSeparator();
cardMenu->addAction(aAttach);
cardMenu->addAction(aDrawArrow);
}
cardMenu->addSeparator();
cardMenu->addAction(aSelectAll);
addRelatedCardView(card, cardMenu);
}
} else {