From 4c2a553f03da8f04aafe613c943f7296458086e9 Mon Sep 17 00:00:00 2001 From: Daenyth Date: Sat, 28 Jun 2014 00:36:08 -0400 Subject: [PATCH] Have servatrice inform players of sideboard size Ref #142 --- cockatrice/src/messagelogwidget.cpp | 12 ++++++++---- cockatrice/src/messagelogwidget.h | 2 +- cockatrice/src/tab_game.cpp | 5 ++++- common/decklist.cpp | 17 ++++++++++++++++- common/decklist.h | 4 +++- common/pb/context_deck_select.proto | 9 +++++---- common/server_player.cpp | 1 + 7 files changed, 38 insertions(+), 12 deletions(-) diff --git a/cockatrice/src/messagelogwidget.cpp b/cockatrice/src/messagelogwidget.cpp index ec9b90cb..cdf173b2 100644 --- a/cockatrice/src/messagelogwidget.cpp +++ b/cockatrice/src/messagelogwidget.cpp @@ -86,12 +86,16 @@ void MessageLogWidget::logLeaveSpectator(QString name) appendHtml(tr("%1 is not watching the game any more.").arg(sanitizeHtml(name))); } -void MessageLogWidget::logDeckSelect(Player *player, QString deckHash) +void MessageLogWidget::logDeckSelect(Player *player, QString deckHash, int sideboardSize) { - if (isFemale(player)) - appendHtml(tr("%1 has loaded a deck (%2).", "female").arg(sanitizeHtml(player->getName())).arg(deckHash)); + const char* gender = isFemale(player) ? "female" : "male"; + if (sideboardSize < 0) + appendHtml(tr("%1 has loaded a deck (%2).", gender).arg(sanitizeHtml(player->getName())).arg(deckHash)); else - appendHtml(tr("%1 has loaded a deck (%2).", "male").arg(sanitizeHtml(player->getName())).arg(deckHash)); + appendHtml(tr("%1 has loaded a deck with (%2) sideboard cards (%3).", gender). + arg(sanitizeHtml(player->getName())). + arg(sideboardSize). + arg(deckHash)); } void MessageLogWidget::logReadyStart(Player *player) diff --git a/cockatrice/src/messagelogwidget.h b/cockatrice/src/messagelogwidget.h index 1747a338..2b12b3c5 100644 --- a/cockatrice/src/messagelogwidget.h +++ b/cockatrice/src/messagelogwidget.h @@ -48,7 +48,7 @@ public slots: void logKicked(); void logJoinSpectator(QString name); void logLeaveSpectator(QString name); - void logDeckSelect(Player *player, QString deckHash); + void logDeckSelect(Player *player, QString deckHash, int sideboardSize); void logReadyStart(Player *player); void logNotReadyStart(Player *player); void logSetSideboardLock(Player *player, bool locked); diff --git a/cockatrice/src/tab_game.cpp b/cockatrice/src/tab_game.cpp index cee00037..b99fff02 100644 --- a/cockatrice/src/tab_game.cpp +++ b/cockatrice/src/tab_game.cpp @@ -1012,7 +1012,10 @@ void TabGame::eventPlayerPropertiesChanged(const Event_PlayerPropertiesChanged & break; } case GameEventContext::DECK_SELECT: { - messageLog->logDeckSelect(player, QString::fromStdString(context.GetExtension(Context_DeckSelect::ext).deck_hash())); + Context_DeckSelect deckSelect = context.GetExtension(Context_DeckSelect::ext); + messageLog->logDeckSelect(player, + QString::fromStdString(deckSelect.deck_hash()), + deckSelect.sideboard_size()); break; } case GameEventContext::SET_SIDEBOARD_LOCK: { diff --git a/common/decklist.cpp b/common/decklist.cpp index c0721556..90b5cb7e 100644 --- a/common/decklist.cpp +++ b/common/decklist.cpp @@ -633,12 +633,27 @@ QStringList DeckList::getCardList() const return result.toList(); } +int DeckList::getSideboardSize() const +{ + int size = 0; + for (int i = 0; i < root->size(); ++i) { + InnerDecklistNode *node = dynamic_cast(root->at(i)); + if (node->getName() != "side") + continue; + for (int j = 0; j < node->size(); j++) { + DecklistCardNode *card = dynamic_cast(node->at(j)); + size += card->getNumber(); + } + } + return size; +} + DecklistCardNode *DeckList::addCard(const QString &cardName, const QString &zoneName) { InnerDecklistNode *zoneNode = dynamic_cast(root->findChild(zoneName)); if (!zoneNode) zoneNode = new InnerDecklistNode(zoneName, root); - + DecklistCardNode *node = new DecklistCardNode(cardName, 1, zoneNode); updateDeckHash(); return node; diff --git a/common/decklist.h b/common/decklist.h index 94df407a..2eed52fc 100644 --- a/common/decklist.h +++ b/common/decklist.h @@ -160,7 +160,9 @@ public: void cleanList(); bool isEmpty() const { return root->isEmpty() && name.isEmpty() && comments.isEmpty() && sideboardPlans.isEmpty(); } QStringList getCardList() const; - + + int getSideboardSize() const; + QString getDeckHash() const { return deckHash; } void updateDeckHash(); diff --git a/common/pb/context_deck_select.proto b/common/pb/context_deck_select.proto index df4a95b5..f36c8b6c 100644 --- a/common/pb/context_deck_select.proto +++ b/common/pb/context_deck_select.proto @@ -1,8 +1,9 @@ import "game_event_context.proto"; message Context_DeckSelect { - extend GameEventContext { - optional Context_DeckSelect ext = 1002; - } - optional string deck_hash = 1; + extend GameEventContext { + optional Context_DeckSelect ext = 1002; + } + optional string deck_hash = 1; + optional int32 sideboard_size = 2 [default = -1]; } diff --git a/common/server_player.cpp b/common/server_player.cpp index a029abed..76cd260d 100644 --- a/common/server_player.cpp +++ b/common/server_player.cpp @@ -657,6 +657,7 @@ Response::ResponseCode Server_Player::cmdDeckSelect(const Command_DeckSelect &cm Context_DeckSelect context; context.set_deck_hash(deck->getDeckHash().toStdString()); + context.set_sideboard_size(deck->getSideboardSize()); ges.setGameEventContext(context); Response_DeckDownload *re = new Response_DeckDownload;