diff --git a/cockatrice/src/game/player/player.cpp b/cockatrice/src/game/player/player.cpp index 8b47f2bc9..efb694090 100644 --- a/cockatrice/src/game/player/player.cpp +++ b/cockatrice/src/game/player/player.cpp @@ -417,6 +417,9 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, T connect(aCreateAnotherToken, &QAction::triggered, this, &Player::actCreateAnotherToken); aCreateAnotherToken->setEnabled(false); + aIncrementAllCardCounters = new QAction(this); + connect(aIncrementAllCardCounters, &QAction::triggered, this, &Player::incrementAllCardCounters); + createPredefinedTokenMenu = new QMenu(QString()); createPredefinedTokenMenu->setEnabled(false); @@ -424,6 +427,7 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, T playerMenu->addSeparator(); countersMenu = playerMenu->addMenu(QString()); + playerMenu->addAction(aIncrementAllCardCounters); playerMenu->addSeparator(); playerMenu->addAction(aUntapAll); playerMenu->addSeparator(); @@ -910,6 +914,7 @@ void Player::retranslateUi() aSetCounter[i]->setText(tr("&Set counters (%1)...").arg(cardCounterSettings.displayName(i))); } + aIncrementAllCardCounters->setText(tr("Increment all card counters")); aMoveToTopLibrary->setText(tr("&Top of library in random order")); aMoveToXfromTopOfLibrary->setText(tr("X cards from the top of library...")); aMoveToBottomLibrary->setText(tr("&Bottom of library in random order")); @@ -971,6 +976,7 @@ void Player::setShortcutsActive() counterIterator.next().value()->setShortcutsActive(); } + aIncrementAllCardCounters->setShortcuts(shortcuts.getShortcut("Player/aIncrementAllCardCounters")); aViewSideboard->setShortcuts(shortcuts.getShortcut("Player/aViewSideboard")); aViewLibrary->setShortcuts(shortcuts.getShortcut("Player/aViewLibrary")); aViewHand->setShortcuts(shortcuts.getShortcut("Player/aViewHand")); @@ -1057,6 +1063,7 @@ void Player::setShortcutsInactive() aMoveBottomCardsToGraveyard->setShortcut(QKeySequence()); aMoveBottomCardToExile->setShortcut(QKeySequence()); aMoveBottomCardsToExile->setShortcut(QKeySequence()); + aIncrementAllCardCounters->setShortcut(QKeySequence()); QMapIterator counterIterator(counters); while (counterIterator.hasNext()) { @@ -3011,6 +3018,51 @@ void Player::clearCounters() counters.clear(); } +void Player::incrementAllCardCounters() +{ + QList cardsToUpdate; + + auto selectedItems = scene()->selectedItems(); + if (!selectedItems.isEmpty()) { + // If cards are selected, only update those + for (const auto &item : selectedItems) { + auto *card = static_cast(item); + cardsToUpdate.append(card); + } + } else { + // If no cards selected, update all cards on table + const CardList &tableCards = table->getCards(); + cardsToUpdate = tableCards; + } + + QList commandList; + + for (const auto *card : cardsToUpdate) { + const auto &cardCounters = card->getCounters(); + + QMapIterator counterIterator(cardCounters); + while (counterIterator.hasNext()) { + counterIterator.next(); + int counterId = counterIterator.key(); + int currentValue = counterIterator.value(); + if (currentValue >= MAX_COUNTERS_ON_CARD) { + continue; + } + + auto cmd = std::make_unique(); + cmd->set_zone(card->getZone()->getName().toStdString()); + cmd->set_card_id(card->getId()); + cmd->set_counter_id(counterId); + cmd->set_counter_value(currentValue + 1); + commandList.append(cmd.release()); + } + } + + if (!commandList.isEmpty()) { + sendGameCommand(prepareGameCommand(commandList)); + } +} + ArrowItem *Player::addArrow(const ServerInfo_Arrow &arrow) { const QMap &playerList = game->getPlayers(); diff --git a/cockatrice/src/game/player/player.h b/cockatrice/src/game/player/player.h index 9062ac5b4..c2aa957a6 100644 --- a/cockatrice/src/game/player/player.h +++ b/cockatrice/src/game/player/player.h @@ -276,7 +276,7 @@ private: QAction *aPlay, *aPlayFacedown, *aHide, *aTap, *aDoesntUntap, *aAttach, *aUnattach, *aDrawArrow, *aSetPT, *aResetPT, *aIncP, *aDecP, *aIncT, *aDecT, *aIncPT, *aDecPT, *aFlowP, *aFlowT, *aSetAnnotation, *aFlip, *aPeek, *aClone, *aMoveToTopLibrary, *aMoveToBottomLibrary, *aMoveToHand, *aMoveToGraveyard, *aMoveToExile, - *aMoveToXfromTopOfLibrary, *aSelectAll, *aSelectRow, *aSelectColumn; + *aMoveToXfromTopOfLibrary, *aSelectAll, *aSelectRow, *aSelectColumn, *aIncrementAllCardCounters; bool movingCardsUntil; QTimer *moveTopCardTimer; @@ -420,6 +420,7 @@ public: AbstractCounter *addCounter(int counterId, const QString &name, QColor color, int radius, int value); void delCounter(int counterId); void clearCounters(); + void incrementAllCardCounters(); ArrowItem *addArrow(const ServerInfo_Arrow &arrow); ArrowItem *addArrow(int arrowId, CardItem *startCard, ArrowTarget *targetItem, const QColor &color); diff --git a/cockatrice/src/settings/shortcuts_settings.h b/cockatrice/src/settings/shortcuts_settings.h index 039c6ca8e..838cfa22d 100644 --- a/cockatrice/src/settings/shortcuts_settings.h +++ b/cockatrice/src/settings/shortcuts_settings.h @@ -413,6 +413,10 @@ private: {"Player/aSetCounter_storm", ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Set Other Counters..."), parseSequenceString("Ctrl+\\"), ShortcutGroup::Player_Counters)}, + {"Player/aIncrementAllCardCounters", + ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Increment all card counters"), + parseSequenceString("Ctrl+Shift+A"), + ShortcutGroup::Playing_Area)}, {"Player/aIncP", ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Add Power (+1/+0)"), parseSequenceString("Ctrl++;Ctrl+="), ShortcutGroup::Power_Toughness)},