From 45ebf885c036b849998c3208c8056ac86fd32bb7 Mon Sep 17 00:00:00 2001 From: Bruno Alexandre Rosa <1791393+brunoalr@users.noreply.github.com> Date: Sat, 28 Mar 2026 02:39:57 -0300 Subject: [PATCH] feat: enable expressions in card counters --- cockatrice/src/game/player/player_actions.cpp | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/cockatrice/src/game/player/player_actions.cpp b/cockatrice/src/game/player/player_actions.cpp index ca0967636..bbfc74a98 100644 --- a/cockatrice/src/game/player/player_actions.cpp +++ b/cockatrice/src/game/player/player_actions.cpp @@ -9,6 +9,8 @@ #include "../zones/logic/view_zone_logic.h" #include "../zones/table_zone.h" #include "card_menu_action_type.h" +#include "libcockatrice/utility/expression.h" +#include "../client/settings/card_counter_settings.h" #include #include @@ -1572,23 +1574,35 @@ void PlayerActions::actCardCounterTrigger() break; } case 11: { // set counter with dialog - bool ok; player->setDialogSemaphore(true); int oldValue = 0; - if (player->getGameScene()->selectedItems().size() == 1) { - auto *card = static_cast(player->getGameScene()->selectedItems().first()); + QString counterName = ""; + + if (auto selectedItems = player->getGameScene()->selectedItems(); selectedItems.size() == 1) { + const auto *card = dynamic_cast(selectedItems.first()); + const auto &cardCounterSettings = SettingsCache::instance().cardCounters(); + counterName = cardCounterSettings.displayName(counterId); oldValue = card->getCounters().value(counterId, 0); } - int number = QInputDialog::getInt(player->getGame()->getTab(), tr("Set counters"), tr("Number:"), oldValue, - 0, MAX_COUNTERS_ON_CARD, 1, &ok); + + AbstractCounterDialog dialog(counterName, QString::number(oldValue), player->getGame()->getTab()); + const int ok = dialog.exec(); + + if (!ok) { + return; + } + + Expression exp(oldValue); + const auto number = static_cast(exp.parse(dialog.textValue())); + player->setDialogSemaphore(false); if (player->clearCardsToDelete() || !ok) { return; } for (const auto &item : player->getGameScene()->selectedItems()) { - auto *card = static_cast(item); + const auto *card = dynamic_cast(item); auto *cmd = new Command_SetCardCounter; cmd->set_zone(card->getZone()->getName().toStdString()); cmd->set_card_id(card->getId());