mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-06-30 02:23:55 -07:00
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:
parent
c9d5d5609c
commit
03db4ccce6
4 changed files with 89 additions and 13 deletions
|
|
@ -307,25 +307,43 @@ void ArrowAttachItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ArrowAttachItem::attachCards(CardItem *startCard, const CardItem *targetCard)
|
||||||
|
{
|
||||||
|
// do nothing if target is already attached to another card
|
||||||
|
if (targetCard->getAttachedTo()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CardZone *startZone = startCard->getZone();
|
||||||
|
CardZone *targetZone = targetCard->getZone();
|
||||||
|
|
||||||
|
// move card onto table first if attaching from some other zone
|
||||||
|
if (startZone->getName() != "table") {
|
||||||
|
auto info = startCard->getInfo();
|
||||||
|
player->playCardToTable(startCard, false, info ? info->getCipt() : false);
|
||||||
|
}
|
||||||
|
|
||||||
|
Command_AttachCard cmd;
|
||||||
|
cmd.set_start_zone("table");
|
||||||
|
cmd.set_card_id(startCard->getId());
|
||||||
|
cmd.set_target_player_id(targetZone->getPlayer()->getId());
|
||||||
|
cmd.set_target_zone(targetZone->getName().toStdString());
|
||||||
|
cmd.set_target_card_id(targetCard->getId());
|
||||||
|
|
||||||
|
player->sendGameCommand(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
void ArrowAttachItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
|
void ArrowAttachItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
|
||||||
{
|
{
|
||||||
if (!startItem)
|
if (!startItem)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (targetItem && (targetItem != startItem)) {
|
if (targetItem && (targetItem != startItem)) {
|
||||||
CardItem *startCard = qgraphicsitem_cast<CardItem *>(startItem);
|
auto startCard = qgraphicsitem_cast<CardItem *>(startItem);
|
||||||
CardZone *startZone = startCard->getZone();
|
auto targetCard = qgraphicsitem_cast<CardItem *>(targetItem);
|
||||||
CardItem *targetCard = qgraphicsitem_cast<CardItem *>(targetItem);
|
if (startCard && targetCard) {
|
||||||
CardZone *targetZone = targetCard->getZone();
|
attachCards(startCard, targetCard);
|
||||||
|
}
|
||||||
Command_AttachCard cmd;
|
|
||||||
cmd.set_start_zone(startZone->getName().toStdString());
|
|
||||||
cmd.set_card_id(startCard->getId());
|
|
||||||
cmd.set_target_player_id(targetZone->getPlayer()->getId());
|
|
||||||
cmd.set_target_zone(targetZone->getName().toStdString());
|
|
||||||
cmd.set_target_card_id(targetCard->getId());
|
|
||||||
|
|
||||||
player->sendGameCommand(cmd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delArrow();
|
delArrow();
|
||||||
|
|
|
||||||
|
|
@ -88,6 +88,8 @@ class ArrowAttachItem : public ArrowItem
|
||||||
private:
|
private:
|
||||||
QList<ArrowAttachItem *> childArrows;
|
QList<ArrowAttachItem *> childArrows;
|
||||||
|
|
||||||
|
void attachCards(CardItem *startCard, const CardItem *targetCard);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ArrowAttachItem(ArrowTarget *_startItem);
|
ArrowAttachItem(ArrowTarget *_startItem);
|
||||||
void addChildArrow(ArrowAttachItem *childArrow);
|
void addChildArrow(ArrowAttachItem *childArrow);
|
||||||
|
|
|
||||||
|
|
@ -2666,6 +2666,46 @@ void Player::playCard(CardItem *card, bool faceDown, bool tapped)
|
||||||
sendGameCommand(cmd);
|
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)
|
void Player::addCard(CardItem *card)
|
||||||
{
|
{
|
||||||
emit newCardAdded(card);
|
emit newCardAdded(card);
|
||||||
|
|
@ -3635,6 +3675,7 @@ void Player::updateCardMenu(const CardItem *card)
|
||||||
cardMenu->addSeparator();
|
cardMenu->addSeparator();
|
||||||
} else if (card->getZone()->getName() == "stack") {
|
} else if (card->getZone()->getName() == "stack") {
|
||||||
// Card is on the stack
|
// Card is on the stack
|
||||||
|
cardMenu->addAction(aAttach);
|
||||||
cardMenu->addAction(aDrawArrow);
|
cardMenu->addAction(aDrawArrow);
|
||||||
cardMenu->addSeparator();
|
cardMenu->addSeparator();
|
||||||
cardMenu->addAction(aClone);
|
cardMenu->addAction(aClone);
|
||||||
|
|
@ -3649,12 +3690,17 @@ void Player::updateCardMenu(const CardItem *card)
|
||||||
cardMenu->addAction(aSelectAll);
|
cardMenu->addAction(aSelectAll);
|
||||||
cardMenu->addAction(aPlay);
|
cardMenu->addAction(aPlay);
|
||||||
cardMenu->addAction(aPlayFacedown);
|
cardMenu->addAction(aPlayFacedown);
|
||||||
|
|
||||||
cardMenu->addSeparator();
|
cardMenu->addSeparator();
|
||||||
cardMenu->addAction(aClone);
|
cardMenu->addAction(aClone);
|
||||||
cardMenu->addMenu(moveMenu);
|
cardMenu->addMenu(moveMenu);
|
||||||
cardMenu->addSeparator();
|
cardMenu->addSeparator();
|
||||||
cardMenu->addAction(aSelectAll);
|
cardMenu->addAction(aSelectAll);
|
||||||
|
|
||||||
|
cardMenu->addSeparator();
|
||||||
|
cardMenu->addAction(aAttach);
|
||||||
|
cardMenu->addAction(aDrawArrow);
|
||||||
|
|
||||||
addRelatedCardView(card, cardMenu);
|
addRelatedCardView(card, cardMenu);
|
||||||
addRelatedCardActions(card, cardMenu);
|
addRelatedCardActions(card, cardMenu);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -3667,8 +3713,17 @@ void Player::updateCardMenu(const CardItem *card)
|
||||||
connect(revealMenu, &QMenu::triggered, this, &Player::actReveal);
|
connect(revealMenu, &QMenu::triggered, this, &Player::actReveal);
|
||||||
|
|
||||||
cardMenu->addMenu(moveMenu);
|
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->addSeparator();
|
||||||
cardMenu->addAction(aSelectAll);
|
cardMenu->addAction(aSelectAll);
|
||||||
|
|
||||||
addRelatedCardView(card, cardMenu);
|
addRelatedCardView(card, cardMenu);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -390,6 +390,7 @@ public:
|
||||||
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
|
||||||
|
|
||||||
void playCard(CardItem *c, bool faceDown, bool tapped);
|
void playCard(CardItem *c, bool faceDown, bool tapped);
|
||||||
|
void playCardToTable(CardItem *c, bool faceDown, bool tapped);
|
||||||
void addCard(CardItem *c);
|
void addCard(CardItem *c);
|
||||||
void deleteCard(CardItem *c);
|
void deleteCard(CardItem *c);
|
||||||
void addZone(CardZone *z);
|
void addZone(CardZone *z);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue