Fix Command Zone graphics/logic layers separation

1. CommandZoneMenu: Changed to take PlayerGraphicsItem* instead of
     PlayerLogic*, accessing logic via player->getLogic()

  2. Removed getCounterWidget() from PlayerLogic;
     method already exists correctly in PlayerGraphicsItem

  3. PlayerMenu: CommandZoneMenu, fixed signal
     connection to use player->getLogic() for commandZoneSupportChanged

  4. AbstractCounter: Connects to CounterState::activeChanged signal,
     removing direct graphics calls from PlayerEventHandler

  5. CommandZone: Explicit tax counter registration via registerTaxCounter()
     with auto-cleanup, replacing childItems()/dynamic_cast iteration

  Also fixed PlayerActions to query CounterState instead of AbstractCounter
  for proper layer separation.
This commit is contained in:
DawnFire42 2026-06-09 14:29:20 -04:00
parent 0b7a323adf
commit 15c1d47a0b
No known key found for this signature in database
GPG key ID: 24BB855EE2911B33
11 changed files with 55 additions and 56 deletions

View file

@ -7,6 +7,7 @@
#include "../../game_graphics/zones/table_zone.h"
#include "../../interface/widgets/tabs/tab_game.h"
#include "../../interface/widgets/utility/get_text_with_max.h"
#include "../board/counter_state.h"
#include "../zones/view_zone_logic.h"
#include <libcockatrice/card/database/card_database_manager.h>
@ -1662,8 +1663,8 @@ void PlayerActions::actPlayAndIncreaseTax(QList<CardItem *> selectedCards)
{
playSelectedCardsImpl(selectedCards, false, [this](CardItem * /*card*/, const QString &originalZone) {
if (originalZone == ZoneNames::COMMAND) {
AbstractCounter *ctr = player->getCounterWidget(CounterIds::CommanderTax);
if (ctr && ctr->isActive()) {
CounterState *state = player->getCounters().value(CounterIds::CommanderTax, nullptr);
if (state && state->isActive()) {
sendIncCounter(CounterIds::CommanderTax, 2);
}
}
@ -1674,8 +1675,8 @@ void PlayerActions::actPlayAndIncreasePartnerTax(QList<CardItem *> selectedCards
{
playSelectedCardsImpl(selectedCards, false, [this](CardItem * /*card*/, const QString &originalZone) {
if (originalZone == ZoneNames::COMMAND) {
AbstractCounter *ctr = player->getCounterWidget(CounterIds::PartnerTax);
if (ctr && ctr->isActive()) {
CounterState *state = player->getCounters().value(CounterIds::PartnerTax, nullptr);
if (state && state->isActive()) {
sendIncCounter(CounterIds::PartnerTax, 2);
}
}
@ -1692,8 +1693,8 @@ void PlayerActions::sendIncCounter(int counterId, int delta)
void PlayerActions::actModifyTaxCounter(int counterId, int delta)
{
AbstractCounter *ctr = player->getCounterWidget(counterId);
if (!ctr || !ctr->isActive()) {
CounterState *state = player->getCounters().value(counterId, nullptr);
if (!state || !state->isActive()) {
return;
}
sendIncCounter(counterId, delta);
@ -1701,13 +1702,13 @@ void PlayerActions::actModifyTaxCounter(int counterId, int delta)
void PlayerActions::actToggleTaxCounter(int counterId)
{
AbstractCounter *ctr = player->getCounterWidget(counterId);
if (!ctr || (ctr->isActive() && ctr->getValue() != 0)) {
CounterState *state = player->getCounters().value(counterId, nullptr);
if (!state || (state->isActive() && state->getValue() != 0)) {
return;
}
Command_SetCounterActive cmd;
cmd.set_counter_id(counterId);
cmd.set_active(!ctr->isActive());
cmd.set_active(!state->isActive());
sendGameCommand(cmd);
}