[Game] Improve context menus and fix face-down play from stack (#6739)

Reorganize card context menus across table, stack, and graveyard/exile zones for better consistency: promote Draw Arrow and Clone actions, move related card entries to the bottom, add Play/Play Face Down to the stack menu, and flatten if/else blocks with early returns. Also fix playCard() ignoring the faceDown flag when routing instants/sorceries from the stack, which sent them to the graveyard instead of the table.
This commit is contained in:
DawnFire42 2026-03-25 18:03:59 -04:00 committed by GitHub
parent 5ef428b9d0
commit dd053c76df
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 41 additions and 40 deletions

View file

@ -110,6 +110,7 @@ CardMenu::CardMenu(Player *_player, const CardItem *_card, bool _shortcutsActive
if (revealedCard) { if (revealedCard) {
addAction(aHide); addAction(aHide);
addSeparator();
addAction(aClone); addAction(aClone);
addSeparator(); addSeparator();
addAction(aSelectAll); addAction(aSelectAll);
@ -148,16 +149,14 @@ void CardMenu::createTableMenu(bool canModifyCard)
{ {
// Card is on the battlefield // Card is on the battlefield
if (!canModifyCard) { if (!canModifyCard) {
addRelatedCardView();
addRelatedCardActions();
addSeparator();
addAction(aDrawArrow); addAction(aDrawArrow);
addSeparator(); addSeparator();
addAction(aClone); addAction(aClone);
addSeparator(); addSeparator();
addAction(aSelectAll); addAction(aSelectAll);
addAction(aSelectRow); addAction(aSelectRow);
addRelatedCardView();
addRelatedCardActions();
return; return;
} }
@ -167,10 +166,9 @@ void CardMenu::createTableMenu(bool canModifyCard)
if (card->getFaceDown()) { if (card->getFaceDown()) {
addAction(aPeek); addAction(aPeek);
} }
addSeparator();
addRelatedCardView(); addAction(aClone);
addRelatedCardActions(); addMenu(new MoveMenu(player));
addSeparator(); addSeparator();
addAction(aAttach); addAction(aAttach);
if (card->getAttachedTo()) { if (card->getAttachedTo()) {
@ -181,9 +179,6 @@ void CardMenu::createTableMenu(bool canModifyCard)
addMenu(new PtMenu(player)); addMenu(new PtMenu(player));
addAction(aSetAnnotation); addAction(aSetAnnotation);
addSeparator(); addSeparator();
addAction(aClone);
addMenu(new MoveMenu(player));
addSeparator();
addAction(aSelectAll); addAction(aSelectAll);
addAction(aSelectRow); addAction(aSelectRow);
@ -199,27 +194,34 @@ void CardMenu::createTableMenu(bool canModifyCard)
} }
addSeparator(); addSeparator();
addMenu(mCardCounters); addMenu(mCardCounters);
addRelatedCardView();
addRelatedCardActions();
} }
void CardMenu::createStackMenu(bool canModifyCard) void CardMenu::createStackMenu(bool canModifyCard)
{ {
// Card is on the stack // Card is on the stack
if (canModifyCard) { if (!canModifyCard) {
addAction(aAttach);
addAction(aDrawArrow);
addSeparator();
addAction(aClone);
addMenu(new MoveMenu(player));
addSeparator();
addAction(aSelectAll);
} else {
addAction(aDrawArrow); addAction(aDrawArrow);
addSeparator(); addSeparator();
addAction(aClone); addAction(aClone);
addSeparator(); addSeparator();
addAction(aSelectAll); addAction(aSelectAll);
addRelatedCardView();
addRelatedCardActions();
return;
} }
addAction(aPlay);
addAction(aPlayFacedown);
addSeparator();
addAction(aClone);
addMenu(new MoveMenu(player));
addSeparator();
addAction(aAttach);
addAction(aDrawArrow);
addSeparator();
addAction(aSelectAll);
addRelatedCardView(); addRelatedCardView();
addRelatedCardActions(); addRelatedCardActions();
} }
@ -227,29 +229,29 @@ void CardMenu::createStackMenu(bool canModifyCard)
void CardMenu::createGraveyardOrExileMenu(bool canModifyCard) void CardMenu::createGraveyardOrExileMenu(bool canModifyCard)
{ {
// Card is in the graveyard or exile // Card is in the graveyard or exile
if (canModifyCard) { if (!canModifyCard) {
addAction(aPlay);
addAction(aPlayFacedown);
addSeparator();
addAction(aClone);
addMenu(new MoveMenu(player));
addSeparator();
addAction(aSelectAll);
addAction(aSelectColumn);
addSeparator();
addAction(aAttach);
addAction(aDrawArrow); addAction(aDrawArrow);
} else { addSeparator();
addAction(aClone); addAction(aClone);
addSeparator(); addSeparator();
addAction(aSelectAll); addAction(aSelectAll);
addAction(aSelectColumn); addAction(aSelectColumn);
addSeparator(); addRelatedCardView();
addAction(aDrawArrow); addRelatedCardActions();
return;
} }
addAction(aPlay);
addAction(aPlayFacedown);
addSeparator();
addAction(aClone);
addMenu(new MoveMenu(player));
addSeparator();
addAction(aAttach);
addAction(aDrawArrow);
addSeparator();
addAction(aSelectAll);
addAction(aSelectColumn);
addRelatedCardView(); addRelatedCardView();
addRelatedCardActions(); addRelatedCardActions();
} }
@ -259,12 +261,11 @@ void CardMenu::createHandOrCustomZoneMenu(bool canModifyCard)
if (!canModifyCard) { if (!canModifyCard) {
addAction(aDrawArrow); addAction(aDrawArrow);
addSeparator(); addSeparator();
addRelatedCardView();
addRelatedCardActions();
addSeparator();
addAction(aClone); addAction(aClone);
addSeparator(); addSeparator();
addAction(aSelectAll); addAction(aSelectAll);
addRelatedCardView();
addRelatedCardActions();
return; return;
} }

View file

@ -64,7 +64,7 @@ void PlayerActions::playCard(CardItem *card, bool faceDown)
int tableRow = info.getUiAttributes().tableRow; int tableRow = info.getUiAttributes().tableRow;
bool playToStack = SettingsCache::instance().getPlayToStack(); bool playToStack = SettingsCache::instance().getPlayToStack();
QString currentZone = card->getZone()->getName(); QString currentZone = card->getZone()->getName();
if (currentZone == ZoneNames::STACK && tableRow == 3) { if (!faceDown && currentZone == ZoneNames::STACK && tableRow == 3) {
cmd.set_target_zone(ZoneNames::GRAVE); cmd.set_target_zone(ZoneNames::GRAVE);
cmd.set_x(0); cmd.set_x(0);
cmd.set_y(0); cmd.set_y(0);