From adbb607700908f43d52cfa988eed8101683db22e Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 24 Mar 2012 17:48:25 +0100 Subject: [PATCH] Revealing a library to a player now grants that player permission to drag cards out of that library onto his own table. This permission is revoked by shuffling the library. The zone view window tracks content changes of the zone for as long as the permission lasts so that card ID changes are kept track of. This hopefully fixes issues #5 and #12. --- cockatrice/src/abstractcarditem.h | 1 + cockatrice/src/carditem.cpp | 28 +++++++--- cockatrice/src/carditem.h | 1 - cockatrice/src/cardzone.cpp | 4 +- cockatrice/src/cardzone.h | 4 +- cockatrice/src/gamescene.cpp | 4 +- cockatrice/src/gamescene.h | 2 +- cockatrice/src/handzone.cpp | 1 + cockatrice/src/messagelogwidget.cpp | 45 +++++++++++----- cockatrice/src/messagelogwidget.h | 2 +- cockatrice/src/pilezone.cpp | 1 + cockatrice/src/player.cpp | 80 ++++++++++++++++++---------- cockatrice/src/player.h | 4 +- cockatrice/src/stackzone.cpp | 1 + cockatrice/src/tab_game.cpp | 16 ++++++ cockatrice/src/tab_game.h | 5 ++ cockatrice/src/tablezone.cpp | 1 + cockatrice/src/zoneviewwidget.cpp | 4 +- cockatrice/src/zoneviewwidget.h | 2 +- cockatrice/src/zoneviewzone.cpp | 21 ++++++-- cockatrice/src/zoneviewzone.h | 7 ++- common/pb/command_move_card.proto | 13 ++--- common/pb/command_reveal_cards.proto | 1 + common/pb/event_move_card.proto | 17 +++--- common/pb/event_reveal_cards.proto | 1 + common/server_cardzone.cpp | 8 +++ common/server_cardzone.h | 4 ++ common/server_player.cpp | 51 ++++++++++++------ common/server_player.h | 1 - common/server_protocolhandler.cpp | 2 - 30 files changed, 231 insertions(+), 101 deletions(-) diff --git a/cockatrice/src/abstractcarditem.h b/cockatrice/src/abstractcarditem.h index 2060537d1..31ee7ec80 100644 --- a/cockatrice/src/abstractcarditem.h +++ b/cockatrice/src/abstractcarditem.h @@ -31,6 +31,7 @@ signals: void hovered(AbstractCardItem *card); void showCardInfoPopup(QPoint pos, QString cardName); void deleteCardInfoPopup(QString cardName); + void updateCardMenu(AbstractCardItem *card, QMenu *cardMenu, QMenu *ptMenu, QMenu *moveMenu); public: enum { Type = typeCard }; int type() const { return Type; } diff --git a/cockatrice/src/carditem.cpp b/cockatrice/src/carditem.cpp index 17bf12b87..04a72a1fd 100644 --- a/cockatrice/src/carditem.cpp +++ b/cockatrice/src/carditem.cpp @@ -8,6 +8,7 @@ #include "carddragitem.h" #include "carddatabase.h" #include "cardzone.h" +#include "zoneviewzone.h" #include "tablezone.h" #include "player.h" #include "arrowitem.h" @@ -26,7 +27,7 @@ CardItem::CardItem(Player *_owner, const QString &_name, int _cardid, bool _reve moveMenu = new QMenu; retranslateUi(); - owner->updateCardMenu(this, cardMenu, ptMenu, moveMenu); + emit updateCardMenu(this, cardMenu, ptMenu, moveMenu); } CardItem::~CardItem() @@ -45,7 +46,7 @@ void CardItem::prepareDelete() if (owner) { if (owner->getCardMenu() == cardMenu) { owner->setCardMenu(0); - owner->setActiveCard(0); + owner->getGame()->setActiveCard(0); } owner = 0; } @@ -70,7 +71,7 @@ void CardItem::deleteLater() void CardItem::setZone(CardZone *_zone) { zone = _zone; - owner->updateCardMenu(this, cardMenu, ptMenu, moveMenu); + emit updateCardMenu(this, cardMenu, ptMenu, moveMenu); } void CardItem::retranslateUi() @@ -183,7 +184,7 @@ void CardItem::setAttachedTo(CardItem *_attachedTo) if (zone) zone->reorganizeCards(); - owner->updateCardMenu(this, cardMenu, ptMenu, moveMenu); + emit updateCardMenu(this, cardMenu, ptMenu, moveMenu); } void CardItem::resetState() @@ -283,7 +284,11 @@ void CardItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) } else if (event->buttons().testFlag(Qt::LeftButton)) { if ((event->screenPos() - event->buttonDownScreenPos(Qt::LeftButton)).manhattanLength() < 2 * QApplication::startDragDistance()) return; - if (!owner->getLocal()) + if (zone->getIsView()) { + const ZoneViewZone *const view = static_cast(zone); + if (view->getRevealZone() && !view->getWriteableRevealZone()) + return; + } else if (!owner->getLocal()) return; bool forceFaceDown = event->modifiers().testFlag(Qt::ShiftModifier); @@ -332,7 +337,14 @@ void CardItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) cardMenu->exec(event->screenPos()); } else if ((event->button() == Qt::LeftButton) && !settingsCache->getDoubleClickToPlay()) { setCursor(Qt::OpenHandCursor); - if (revealedCard) + + bool hideCard = false; + if (zone->getIsView()) { + ZoneViewZone *view = static_cast(zone); + if (view->getRevealZone() && !view->getWriteableRevealZone()) + hideCard = true; + } + if (hideCard) zone->removeCard(this); else playCard(event->modifiers().testFlag(Qt::ShiftModifier)); @@ -374,10 +386,10 @@ QVariant CardItem::itemChange(GraphicsItemChange change, const QVariant &value) if ((change == ItemSelectedHasChanged) && owner) { if (value == true) { owner->setCardMenu(cardMenu); - owner->setActiveCard(this); + owner->getGame()->setActiveCard(this); } else if (owner->getCardMenu() == cardMenu) { owner->setCardMenu(0); - owner->setActiveCard(0); + owner->getGame()->setActiveCard(0); } } return QGraphicsItem::itemChange(change, value); diff --git a/cockatrice/src/carditem.h b/cockatrice/src/carditem.h index cb108e22e..604815c39 100644 --- a/cockatrice/src/carditem.h +++ b/cockatrice/src/carditem.h @@ -74,7 +74,6 @@ public: const QList &getAttachedCards() const { return attachedCards; } void resetState(); void processCardInfo(const ServerInfo_Card &info); - void updateCardMenu(); bool animationEvent(); CardDragItem *createDragItem(int _id, const QPointF &_pos, const QPointF &_scenePos, bool faceDown); diff --git a/cockatrice/src/cardzone.cpp b/cockatrice/src/cardzone.cpp index 284e66969..a9617f810 100644 --- a/cockatrice/src/cardzone.cpp +++ b/cockatrice/src/cardzone.cpp @@ -9,8 +9,8 @@ #include "pb/command_move_card.pb.h" #include "pb/serverinfo_user.pb.h" -CardZone::CardZone(Player *_p, const QString &_name, bool _hasCardAttr, bool _isShufflable, bool _contentsKnown, QGraphicsItem *parent, bool isView) - : AbstractGraphicsItem(parent), player(_p), name(_name), cards(_contentsKnown), view(NULL), menu(NULL), doubleClickAction(0), hasCardAttr(_hasCardAttr), isShufflable(_isShufflable) +CardZone::CardZone(Player *_p, const QString &_name, bool _hasCardAttr, bool _isShufflable, bool _contentsKnown, QGraphicsItem *parent, bool _isView) + : AbstractGraphicsItem(parent), player(_p), name(_name), cards(_contentsKnown), view(NULL), menu(NULL), doubleClickAction(0), hasCardAttr(_hasCardAttr), isShufflable(_isShufflable), isView(_isView) { if (!isView) player->addZone(this); diff --git a/cockatrice/src/cardzone.h b/cockatrice/src/cardzone.h index 1f2ddfee6..7120cdd07 100644 --- a/cockatrice/src/cardzone.h +++ b/cockatrice/src/cardzone.h @@ -24,6 +24,7 @@ protected: QAction *doubleClickAction; bool hasCardAttr; bool isShufflable; + bool isView; void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); void mousePressEvent(QGraphicsSceneMouseEvent *event); virtual void addCardImpl(CardItem *card, int x, int y) = 0; @@ -36,7 +37,7 @@ public: enum { Type = typeZone }; int type() const { return Type; } virtual void handleDropEvent(const QList &dragItem, CardZone *startZone, const QPoint &dropPoint) = 0; - CardZone(Player *_player, const QString &_name, bool _hasCardAttr, bool _isShufflable, bool _contentsKnown, QGraphicsItem *parent = 0, bool isView = false); + CardZone(Player *_player, const QString &_name, bool _hasCardAttr, bool _isShufflable, bool _contentsKnown, QGraphicsItem *parent = 0, bool _isView = false); ~CardZone(); void retranslateUi(); void clearContents(); @@ -59,6 +60,7 @@ public: void setView(ZoneViewZone *_view) { view = _view; } virtual void reorganizeCards() = 0; virtual QPointF closestGridPoint(const QPointF &point); + bool getIsView() const { return isView; } }; #endif diff --git a/cockatrice/src/gamescene.cpp b/cockatrice/src/gamescene.cpp index 451cf1a42..1307eb506 100644 --- a/cockatrice/src/gamescene.cpp +++ b/cockatrice/src/gamescene.cpp @@ -128,9 +128,9 @@ void GameScene::toggleZoneView(Player *player, const QString &zoneName, int numb item->setPos(50, 50); } -void GameScene::addRevealedZoneView(Player *player, CardZone *zone, const QList &cardList) +void GameScene::addRevealedZoneView(Player *player, CardZone *zone, const QList &cardList, bool withWritePermission) { - ZoneViewWidget *item = new ZoneViewWidget(player, zone, -2, true, cardList); + ZoneViewWidget *item = new ZoneViewWidget(player, zone, -2, true, withWritePermission, cardList); zoneViews.append(item); connect(item, SIGNAL(closePressed(ZoneViewWidget *)), this, SLOT(removeZoneView(ZoneViewWidget *))); addItem(item); diff --git a/cockatrice/src/gamescene.h b/cockatrice/src/gamescene.h index 900587956..7deb78c82 100644 --- a/cockatrice/src/gamescene.h +++ b/cockatrice/src/gamescene.h @@ -45,7 +45,7 @@ public: void unregisterAnimationItem(AbstractCardItem *card); public slots: void toggleZoneView(Player *player, const QString &zoneName, int numberCards); - void addRevealedZoneView(Player *player, CardZone *zone, const QList &cardList); + void addRevealedZoneView(Player *player, CardZone *zone, const QList &cardList, bool withWritePermission); void removeZoneView(ZoneViewWidget *item); void addPlayer(Player *player); void removePlayer(Player *player); diff --git a/cockatrice/src/handzone.cpp b/cockatrice/src/handzone.cpp index 60f5806a8..98440a077 100644 --- a/cockatrice/src/handzone.cpp +++ b/cockatrice/src/handzone.cpp @@ -42,6 +42,7 @@ void HandZone::addCardImpl(CardItem *card, int x, int /*y*/) void HandZone::handleDropEvent(const QList &dragItems, CardZone *startZone, const QPoint &/*dropPoint*/) { Command_MoveCard cmd; + cmd.set_start_player_id(startZone->getPlayer()->getId()); cmd.set_start_zone(startZone->getName().toStdString()); cmd.set_target_player_id(player->getId()); cmd.set_target_zone(getName().toStdString()); diff --git a/cockatrice/src/messagelogwidget.cpp b/cockatrice/src/messagelogwidget.cpp index 41f0e2f10..3dd2b63be 100644 --- a/cockatrice/src/messagelogwidget.cpp +++ b/cockatrice/src/messagelogwidget.cpp @@ -171,7 +171,7 @@ void MessageLogWidget::logUndoDraw(Player *player, QString cardName) appendHtml((isFemale(player) ? tr("%1 undoes her last draw (%2).") : tr("%1 undoes his last draw (%2).")).arg(sanitizeHtml(player->getName())).arg(QString("%1").arg(sanitizeHtml(cardName)))); } -QPair MessageLogWidget::getFromStr(CardZone *zone, QString cardName, int position) const +QPair MessageLogWidget::getFromStr(CardZone *zone, QString cardName, int position, bool ownerChange) const { bool cardNameContainsStartZone = false; QString fromStr; @@ -188,18 +188,36 @@ QPair MessageLogWidget::getFromStr(CardZone *zone, QString car else if (startName == "deck") { if (position >= zone->getCards().size() - 1) { if (cardName.isEmpty()) { - cardName = isFemale(zone->getPlayer()) ? tr("the bottom card of her library") : tr("the bottom card of his library"); + if (ownerChange) + cardName = tr("the bottom card of %1's library").arg(zone->getPlayer()->getName()); + else + cardName = isFemale(zone->getPlayer()) ? tr("the bottom card of her library") : tr("the bottom card of his library"); cardNameContainsStartZone = true; - } else - fromStr = isFemale(zone->getPlayer()) ? tr(" from the bottom of her library") : tr(" from the bottom of his library"); + } else { + if (ownerChange) + fromStr = tr(" from the bottom of %1's library").arg(zone->getPlayer()->getName()); + else + fromStr = isFemale(zone->getPlayer()) ? tr(" from the bottom of her library") : tr(" from the bottom of his library"); + } } else if (position == 0) { if (cardName.isEmpty()) { - cardName = isFemale(zone->getPlayer()) ? tr("the top card of her library") : tr("the top card of his library"); + if (ownerChange) + cardName = tr("the top card of %1's library").arg(zone->getPlayer()->getName()); + else + cardName = isFemale(zone->getPlayer()) ? tr("the top card of her library") : tr("the top card of his library"); cardNameContainsStartZone = true; - } else - fromStr = isFemale(zone->getPlayer()) ? tr(" from the top of her library") : tr(" from the top of his library"); - } else - fromStr = tr(" from library"); + } else { + if (ownerChange) + fromStr = tr(" from the top of %1's library").arg(zone->getPlayer()->getName()); + else + fromStr = isFemale(zone->getPlayer()) ? tr(" from the top of her library") : tr(" from the top of his library"); + } + } else { + if (ownerChange) + fromStr = tr(" from %1's library").arg(zone->getPlayer()->getName()); + else + fromStr = tr(" from library"); + } } else if (startName == "sb") fromStr = tr(" from sideboard"); else if (startName == "stack") @@ -212,12 +230,13 @@ QPair MessageLogWidget::getFromStr(CardZone *zone, QString car void MessageLogWidget::doMoveCard(LogMoveCard &attributes) { + bool ownerChange = attributes.startZone->getPlayer() != attributes.targetZone->getPlayer(); QString startName = attributes.startZone->getName(); QString targetName = attributes.targetZone->getName(); if (((startName == "table") && (targetName == "table") && (attributes.startZone == attributes.targetZone)) || ((startName == "hand") && (targetName == "hand"))) return; QString cardName = attributes.cardName; - QPair temp = getFromStr(attributes.startZone, cardName, attributes.oldX); + QPair temp = getFromStr(attributes.startZone, cardName, attributes.oldX, ownerChange); bool cardNameContainsStartZone = false; if (!temp.first.isEmpty()) { cardNameContainsStartZone = true; @@ -231,8 +250,8 @@ void MessageLogWidget::doMoveCard(LogMoveCard &attributes) cardStr = tr("a card"); else cardStr = QString("%1").arg(sanitizeHtml(cardName)); - - if (attributes.startZone->getPlayer() != attributes.targetZone->getPlayer()) { + + if (ownerChange && (attributes.startZone->getPlayer() == attributes.player)) { appendHtml(tr("%1 gives %2 control over %3.").arg(sanitizeHtml(attributes.player->getName())).arg(sanitizeHtml(attributes.targetZone->getPlayer()->getName())).arg(cardStr)); return; } @@ -627,7 +646,7 @@ void MessageLogWidget::logStopDumpZone(Player *player, CardZone *zone) void MessageLogWidget::logRevealCards(Player *player, CardZone *zone, int cardId, QString cardName, Player *otherPlayer) { - QPair temp = getFromStr(zone, cardName, cardId); + QPair temp = getFromStr(zone, cardName, cardId, false); bool cardNameContainsStartZone = false; if (!temp.first.isEmpty()) { cardNameContainsStartZone = true; diff --git a/cockatrice/src/messagelogwidget.h b/cockatrice/src/messagelogwidget.h index abbe9eb94..08d6ac6b1 100644 --- a/cockatrice/src/messagelogwidget.h +++ b/cockatrice/src/messagelogwidget.h @@ -28,7 +28,7 @@ private: QString sanitizeHtml(QString dirty) const; bool isFemale(Player *player) const; - QPair getFromStr(CardZone *zone, QString cardName, int position) const; + QPair getFromStr(CardZone *zone, QString cardName, int position, bool ownerChange) const; MessageContext currentContext; bool female; diff --git a/cockatrice/src/pilezone.cpp b/cockatrice/src/pilezone.cpp index 4436d9a55..48f377513 100644 --- a/cockatrice/src/pilezone.cpp +++ b/cockatrice/src/pilezone.cpp @@ -53,6 +53,7 @@ void PileZone::addCardImpl(CardItem *card, int x, int /*y*/) void PileZone::handleDropEvent(const QList &dragItems, CardZone *startZone, const QPoint &/*dropPoint*/) { Command_MoveCard cmd; + cmd.set_start_player_id(startZone->getPlayer()->getId()); cmd.set_start_zone(startZone->getName().toStdString()); cmd.set_target_player_id(player->getId()); cmd.set_target_zone(getName().toStdString()); diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp index 2c782be00..a69e65be3 100644 --- a/cockatrice/src/player.cpp +++ b/cockatrice/src/player.cpp @@ -93,7 +93,7 @@ void PlayerArea::setSize(qreal width, qreal height) } Player::Player(const ServerInfo_User &info, int _id, bool _local, TabGame *_parent) - : QObject(_parent), activeCard(0), shortcutsActive(false), defaultNumberTopCards(3), lastTokenDestroy(true), id(_id), active(false), local(_local), mirrored(false), handVisible(false), conceded(false), dialogSemaphore(false) + : QObject(_parent), game(_parent), shortcutsActive(false), defaultNumberTopCards(3), lastTokenDestroy(true), id(_id), active(false), local(_local), mirrored(false), handVisible(false), conceded(false), dialogSemaphore(false) { userInfo = new ServerInfo_User; userInfo->CopyFrom(info); @@ -392,7 +392,7 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, TabGame *_pare connect(tempSetCounter, SIGNAL(triggered()), this, SLOT(actCardCounterTrigger())); } - const QList &players = _parent->getPlayers().values(); + const QList &players = game->getPlayers().values(); for (int i = 0; i < players.size(); ++i) addPlayer(players[i]); @@ -460,9 +460,10 @@ void Player::playerListActionTriggered() if (otherPlayerId != -1) cmd.set_player_id(otherPlayerId); - if (menu == mRevealLibrary) + if (menu == mRevealLibrary) { cmd.set_zone_name("deck"); - else if (menu == mRevealTopCard) { + cmd.set_grant_write_access(true); + } else if (menu == mRevealTopCard) { cmd.set_zone_name("deck"); cmd.set_card_id(0); } else if (menu == mRevealHand) @@ -937,6 +938,9 @@ void Player::eventShuffle(const Event_Shuffle &event) CardZone *zone = zones.value(QString::fromStdString(event.zone_name())); if (!zone) return; + if (zone->getView()) + if (zone->getView()->getRevealZone()) + zone->getView()->setWriteableRevealZone(false); emit logShuffle(this, zone); } @@ -1040,7 +1044,7 @@ void Player::eventDelCounter(const Event_DelCounter &event) void Player::eventDumpZone(const Event_DumpZone &event) { - Player *zoneOwner = static_cast(parent())->getPlayers().value(event.zone_owner_id(), 0); + Player *zoneOwner = game->getPlayers().value(event.zone_owner_id(), 0); if (!zoneOwner) return; CardZone *zone = zoneOwner->getZones().value(QString::fromStdString(event.zone_name()), 0); @@ -1051,7 +1055,7 @@ void Player::eventDumpZone(const Event_DumpZone &event) void Player::eventStopDumpZone(const Event_StopDumpZone &event) { - Player *zoneOwner = static_cast(parent())->getPlayers().value(event.zone_owner_id(), 0); + Player *zoneOwner = game->getPlayers().value(event.zone_owner_id(), 0); if (!zoneOwner) return; CardZone *zone = zoneOwner->getZones().value(QString::fromStdString(event.zone_name()), 0); @@ -1062,8 +1066,11 @@ void Player::eventStopDumpZone(const Event_StopDumpZone &event) void Player::eventMoveCard(const Event_MoveCard &event, const GameEventContext &context) { - CardZone *startZone = zones.value(QString::fromStdString(event.start_zone()), 0); - Player *targetPlayer = static_cast(parent())->getPlayers().value(event.target_player_id()); + Player *startPlayer = game->getPlayers().value(event.start_player_id()); + if (!startPlayer) + return; + CardZone *startZone = startPlayer->getZones().value(QString::fromStdString(event.start_zone()), 0); + Player *targetPlayer = game->getPlayers().value(event.target_player_id()); if (!targetPlayer) return; CardZone *targetZone; @@ -1122,7 +1129,7 @@ void Player::eventMoveCard(const Event_MoveCard &event, const GameEventContext & // Look at all arrows from and to the card. // If the card was moved to another zone, delete the arrows, otherwise update them. - QMapIterator playerIterator(static_cast(parent())->getPlayers()); + QMapIterator playerIterator(game->getPlayers()); while (playerIterator.hasNext()) { Player *p = playerIterator.next().value(); @@ -1176,7 +1183,7 @@ void Player::eventDestroyCard(const Event_DestroyCard &event) void Player::eventAttachCard(const Event_AttachCard &event) { - const QMap &playerList = static_cast(parent())->getPlayers(); + const QMap &playerList = game->getPlayers(); Player *targetPlayer = 0; CardZone *targetZone = 0; CardItem *targetCard = 0; @@ -1244,7 +1251,7 @@ void Player::eventRevealCards(const Event_RevealCards &event) return; Player *otherPlayer = 0; if (event.has_other_player_id()) { - otherPlayer = static_cast(parent())->getPlayers().value(event.other_player_id()); + otherPlayer = game->getPlayers().value(event.other_player_id()); if (!otherPlayer) return; } @@ -1256,7 +1263,7 @@ void Player::eventRevealCards(const Event_RevealCards &event) cardList.append(temp); } if (!cardList.isEmpty()) - static_cast(scene())->addRevealedZoneView(this, zone, cardList); + static_cast(scene())->addRevealedZoneView(this, zone, cardList, event.grant_write_access()); QString cardName; if (cardList.size() == 1) @@ -1364,7 +1371,7 @@ void Player::processCardAttachment(const ServerInfo_Player &info) const ServerInfo_Card &cardInfo = zoneInfo.card_list(j); if (cardInfo.has_attach_player_id()) { CardItem *startCard = zone->getCard(cardInfo.id(), QString()); - CardItem *targetCard = static_cast(parent())->getCard(cardInfo.attach_player_id(), QString::fromStdString(cardInfo.attach_zone()), cardInfo.attach_card_id()); + CardItem *targetCard = game->getCard(cardInfo.attach_player_id(), QString::fromStdString(cardInfo.attach_zone()), cardInfo.attach_card_id()); if (!targetCard) continue; @@ -1377,6 +1384,7 @@ void Player::processCardAttachment(const ServerInfo_Player &info) void Player::playCard(CardItem *c, bool faceDown, bool tapped) { Command_MoveCard cmd; + cmd.set_start_player_id(c->getZone()->getPlayer()->getId()); cmd.set_start_zone(c->getZone()->getName().toStdString()); cmd.set_target_player_id(getId()); CardToMove *cardToMove = cmd.mutable_cards_to_move()->add_card(); @@ -1465,7 +1473,7 @@ void Player::clearCounters() ArrowItem *Player::addArrow(const ServerInfo_Arrow &arrow) { - const QMap &playerList = static_cast(parent())->getPlayers(); + const QMap &playerList = game->getPlayers(); Player *startPlayer = playerList.value(arrow.start_player_id(), 0); Player *targetPlayer = playerList.value(arrow.target_player_id(), 0); if (!startPlayer || !targetPlayer) @@ -1552,22 +1560,22 @@ void Player::rearrangeCounters() PendingCommand * Player::prepareGameCommand(const google::protobuf::Message &cmd) { - return static_cast(parent())->prepareGameCommand(cmd); + return game->prepareGameCommand(cmd); } PendingCommand * Player::prepareGameCommand(const QList &cmdList) { - return static_cast(parent())->prepareGameCommand(cmdList); + return game->prepareGameCommand(cmdList); } void Player::sendGameCommand(const google::protobuf::Message &command) { - static_cast(parent())->sendGameCommand(command, id); + game->sendGameCommand(command, id); } void Player::sendGameCommand(PendingCommand *pend) { - static_cast(parent())->sendGameCommand(pend, id); + game->sendGameCommand(pend, id); } bool Player::clearCardsToDelete() @@ -1651,11 +1659,13 @@ void Player::cardMenuAction() ListOfCardsToMove idList; for (int i = 0; i < cardList.size(); ++i) idList.add_card()->set_card_id(cardList[i]->getId()); + int startPlayerId = cardList[0]->getZone()->getPlayer()->getId(); QString startZone = cardList[0]->getZone()->getName(); switch (a->data().toInt()) { case 5: { Command_MoveCard *cmd = new Command_MoveCard; + cmd->set_start_player_id(startPlayerId); cmd->set_start_zone(startZone.toStdString()); cmd->mutable_cards_to_move()->CopyFrom(idList); cmd->set_target_player_id(getId()); @@ -1667,6 +1677,7 @@ void Player::cardMenuAction() } case 6: { Command_MoveCard *cmd = new Command_MoveCard; + cmd->set_start_player_id(startPlayerId); cmd->set_start_zone(startZone.toStdString()); cmd->mutable_cards_to_move()->CopyFrom(idList); cmd->set_target_player_id(getId()); @@ -1678,6 +1689,7 @@ void Player::cardMenuAction() } case 7: { Command_MoveCard *cmd = new Command_MoveCard; + cmd->set_start_player_id(startPlayerId); cmd->set_start_zone(startZone.toStdString()); cmd->mutable_cards_to_move()->CopyFrom(idList); cmd->set_target_player_id(getId()); @@ -1689,6 +1701,7 @@ void Player::cardMenuAction() } case 8: { Command_MoveCard *cmd = new Command_MoveCard; + cmd->set_start_player_id(startPlayerId); cmd->set_start_zone(startZone.toStdString()); cmd->mutable_cards_to_move()->CopyFrom(idList); cmd->set_target_player_id(getId()); @@ -1701,7 +1714,7 @@ void Player::cardMenuAction() default: ; } } - static_cast(parent())->sendGameCommand(prepareGameCommand(commandList)); + game->sendGameCommand(prepareGameCommand(commandList)); } void Player::actIncPT(int deltaP, int deltaT) @@ -1756,7 +1769,7 @@ void Player::actSetPT() void Player::actDrawArrow() { - activeCard->drawArrow(Qt::red); + game->getActiveCard()->drawArrow(Qt::red); } void Player::actIncP() @@ -1824,7 +1837,7 @@ void Player::actSetAnnotation() void Player::actAttach() { - ArrowAttachItem *arrow = new ArrowAttachItem(activeCard); + ArrowAttachItem *arrow = new ArrowAttachItem(game->getActiveCard()); scene()->addItem(arrow); arrow->grabMouse(); } @@ -1832,8 +1845,8 @@ void Player::actAttach() void Player::actUnattach() { Command_AttachCard cmd; - cmd.set_start_zone(activeCard->getZone()->getName().toStdString()); - cmd.set_card_id(activeCard->getId()); + cmd.set_start_zone(game->getActiveCard()->getZone()->getName().toStdString()); + cmd.set_card_id(game->getActiveCard()->getId()); sendGameCommand(cmd); } @@ -1903,21 +1916,34 @@ void Player::actCardCounterTrigger() void Player::actPlay() { - activeCard->playCard(false); + playCard(game->getActiveCard(), false, game->getActiveCard()->getInfo()->getCipt()); } void Player::actHide() { - activeCard->getZone()->removeCard(activeCard); + game->getActiveCard()->getZone()->removeCard(game->getActiveCard()); } void Player::updateCardMenu(CardItem *card, QMenu *cardMenu, QMenu *ptMenu, QMenu *moveMenu) { cardMenu->clear(); - if (card->getRevealedCard()) + bool revealedCard = false; + bool writeableCard = getLocal(); + if (card->getZone()) + if (card->getZone()->getIsView()) { + ZoneViewZone *view = static_cast(card->getZone()); + if (view->getRevealZone()) { + if (view->getWriteableRevealZone()) + writeableCard = true; + else + revealedCard = true; + } + } + + if (revealedCard) cardMenu->addAction(aHide); - else if (getLocal()) { + else if (writeableCard) { if (moveMenu->isEmpty()) { moveMenu->addAction(aMoveToTopLibrary); moveMenu->addAction(aMoveToBottomLibrary); diff --git a/cockatrice/src/player.h b/cockatrice/src/player.h index 622c386b8..d0a772140 100644 --- a/cockatrice/src/player.h +++ b/cockatrice/src/player.h @@ -148,6 +148,7 @@ private slots: void actHide(); private: + TabGame *game; QMenu *playerMenu, *handMenu, *graveMenu, *rfgMenu, *libraryMenu, *sbMenu, *countersMenu, *sayMenu, *mRevealLibrary, *mRevealTopCard, *mRevealHand, *mRevealRandomHandCard; QList playerLists; @@ -160,7 +161,6 @@ private: *aDrawCard, *aDrawCards, *aUndoDraw, *aMulligan, *aShuffle, *aUntapAll, *aRollDie, *aCreateToken, *aCreateAnotherToken, *aCardMenu; - CardItem *activeCard; QList aAddCounter, aSetCounter, aRemoveCounter; QAction *aPlay, @@ -250,6 +250,7 @@ public: ~Player(); void retranslateUi(); void clear(); + TabGame *getGame() const { return game; } QMenu *getPlayerMenu() const { return playerMenu; } int getId() const { return id; } QString getName() const; @@ -260,7 +261,6 @@ public: const QMap &getArrows() const { return arrows; } void setCardMenu(QMenu *menu); QMenu *getCardMenu() const; - void setActiveCard(CardItem *card) { activeCard = card; } void updateCardMenu(CardItem *card, QMenu *cardMenu, QMenu *ptMenu, QMenu *moveMenu); bool getActive() const { return active; } void setActive(bool _active); diff --git a/cockatrice/src/stackzone.cpp b/cockatrice/src/stackzone.cpp index 938dcdfcd..216dac991 100644 --- a/cockatrice/src/stackzone.cpp +++ b/cockatrice/src/stackzone.cpp @@ -60,6 +60,7 @@ void StackZone::handleDropEvent(const QList &dragItems, CardZone return; Command_MoveCard cmd; + cmd.set_start_player_id(startZone->getPlayer()->getId()); cmd.set_start_zone(startZone->getName().toStdString()); cmd.set_target_player_id(player->getId()); cmd.set_target_zone(getName().toStdString()); diff --git a/cockatrice/src/tab_game.cpp b/cockatrice/src/tab_game.cpp index 27b15485d..f4858fe72 100644 --- a/cockatrice/src/tab_game.cpp +++ b/cockatrice/src/tab_game.cpp @@ -210,6 +210,7 @@ TabGame::TabGame(GameReplay *_replay) started(false), resuming(false), currentPhase(-1), + activeCard(0), replay(_replay), currentReplayStep(0) { @@ -355,6 +356,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, QList &_client started(false), resuming(event.resuming()), currentPhase(-1), + activeCard(0), replay(0) { gameTimer = new QTimer(this); @@ -1063,6 +1065,7 @@ void TabGame::newCardAdded(AbstractCardItem *card) connect(card, SIGNAL(hovered(AbstractCardItem *)), cardInfo, SLOT(setCard(AbstractCardItem *))); connect(card, SIGNAL(showCardInfoPopup(QPoint, QString)), this, SLOT(showCardInfoPopup(QPoint, QString))); connect(card, SIGNAL(deleteCardInfoPopup(QString)), this, SLOT(deleteCardInfoPopup(QString))); + connect(card, SIGNAL(updateCardMenu(AbstractCardItem*,QMenu*,QMenu*,QMenu*)), this, SLOT(updateCardMenu(AbstractCardItem*,QMenu*,QMenu*,QMenu*))); } CardItem *TabGame::getCard(int playerId, const QString &zoneName, int cardId) const @@ -1102,3 +1105,16 @@ Player *TabGame::getActiveLocalPlayer() const return 0; } +#include +void TabGame::updateCardMenu(AbstractCardItem *card, QMenu *cardMenu, QMenu *ptMenu, QMenu *moveMenu) +{ + Player *p; + if ((clients.size() > 1) || !players.contains(localPlayerId)) { + qDebug("BUG"); + p = card->getOwner(); + } else { + p = players.value(localPlayerId); + qDebug() << "GEFUNDEN" << localPlayerId << p->getName(); + } + p->updateCardMenu(static_cast(card), cardMenu, ptMenu, moveMenu); +} diff --git a/cockatrice/src/tab_game.h b/cockatrice/src/tab_game.h index bb4dda88e..ca2395fe5 100644 --- a/cockatrice/src/tab_game.h +++ b/cockatrice/src/tab_game.h @@ -110,6 +110,7 @@ private: QStringList phasesList; int currentPhase; int activePlayer; + CardItem *activeCard; // Replay related members GameReplay *replay; @@ -177,6 +178,7 @@ private slots: void incrementGameTime(); void adminLockChanged(bool lock); void newCardAdded(AbstractCardItem *card); + void updateCardMenu(AbstractCardItem *card, QMenu *cardMenu, QMenu *ptMenu, QMenu *moveMenu); void actConcede(); void actLeaveGame(); @@ -201,6 +203,9 @@ public: bool getSpectatorsSeeEverything() const { return spectatorsSeeEverything; } Player *getActiveLocalPlayer() const; AbstractClient *getClientForPlayer(int playerId) const; + + void setActiveCard(CardItem *_card) { activeCard = _card; } + CardItem *getActiveCard() const { return activeCard; } void processGameEventContainer(const GameEventContainer &cont, AbstractClient *client); PendingCommand *prepareGameCommand(const ::google::protobuf::Message &cmd); diff --git a/cockatrice/src/tablezone.cpp b/cockatrice/src/tablezone.cpp index 1154d3932..63c17a5fa 100644 --- a/cockatrice/src/tablezone.cpp +++ b/cockatrice/src/tablezone.cpp @@ -97,6 +97,7 @@ void TableZone::handleDropEvent(const QList &dragItems, CardZone void TableZone::handleDropEventByGrid(const QList &dragItems, CardZone *startZone, const QPoint &gridPoint) { Command_MoveCard cmd; + cmd.set_start_player_id(startZone->getPlayer()->getId()); cmd.set_start_zone(startZone->getName().toStdString()); cmd.set_target_player_id(player->getId()); cmd.set_target_zone(getName().toStdString()); diff --git a/cockatrice/src/zoneviewwidget.cpp b/cockatrice/src/zoneviewwidget.cpp index 5bcb66a9e..a9e62cfe0 100644 --- a/cockatrice/src/zoneviewwidget.cpp +++ b/cockatrice/src/zoneviewwidget.cpp @@ -55,7 +55,7 @@ void TitleLabel::mouseMoveEvent(QGraphicsSceneMouseEvent *event) emit mouseMoved(event->scenePos() - buttonDownPos); } -ZoneViewWidget::ZoneViewWidget(Player *_player, CardZone *_origZone, int numberCards, bool _revealZone, const QList &cardList) +ZoneViewWidget::ZoneViewWidget(Player *_player, CardZone *_origZone, int numberCards, bool _revealZone, bool _writeableRevealZone, const QList &cardList) : QGraphicsWidget(0, Qt::Tool | Qt::FramelessWindowHint), player(_player) { setAcceptHoverEvents(true); @@ -105,7 +105,7 @@ ZoneViewWidget::ZoneViewWidget(Player *_player, CardZone *_origZone, int numberC extraHeight = vbox->sizeHint(Qt::PreferredSize).height(); resize(150, 150); - zone = new ZoneViewZone(player, _origZone, numberCards, _revealZone, this); + zone = new ZoneViewZone(player, _origZone, numberCards, _revealZone, _writeableRevealZone, this); vbox->addItem(zone); if (sortByNameCheckBox) { diff --git a/cockatrice/src/zoneviewwidget.h b/cockatrice/src/zoneviewwidget.h index af414dfa3..0b8eef7a6 100644 --- a/cockatrice/src/zoneviewwidget.h +++ b/cockatrice/src/zoneviewwidget.h @@ -51,7 +51,7 @@ private slots: void zoneDeleted(); void moveWidget(QPointF scenePos); public: - ZoneViewWidget(Player *_player, CardZone *_origZone, int numberCards = 0, bool _revealZone = false, const QList &cardList = QList()); + ZoneViewWidget(Player *_player, CardZone *_origZone, int numberCards = 0, bool _revealZone = false, bool _writeableRevealZone = false, const QList &cardList = QList()); ZoneViewZone *getZone() const { return zone; } void retranslateUi(); protected: diff --git a/cockatrice/src/zoneviewzone.cpp b/cockatrice/src/zoneviewzone.cpp index 81003d1d5..cd27984ba 100644 --- a/cockatrice/src/zoneviewzone.cpp +++ b/cockatrice/src/zoneviewzone.cpp @@ -10,10 +10,11 @@ #include "pb/response_dump_zone.pb.h" #include "pending_command.h" -ZoneViewZone::ZoneViewZone(Player *_p, CardZone *_origZone, int _numberCards, bool _revealZone, QGraphicsItem *parent) - : SelectZone(_p, _origZone->getName(), false, false, true, parent, true), bRect(QRectF()), minRows(0), numberCards(_numberCards), origZone(_origZone), revealZone(_revealZone), sortByName(false), sortByType(false) +ZoneViewZone::ZoneViewZone(Player *_p, CardZone *_origZone, int _numberCards, bool _revealZone, bool _writeableRevealZone, QGraphicsItem *parent) + : SelectZone(_p, _origZone->getName(), false, false, true, parent, true), bRect(QRectF()), minRows(0), numberCards(_numberCards), origZone(_origZone), revealZone(_revealZone), writeableRevealZone(_writeableRevealZone), sortByName(false), sortByType(false) { - if (!revealZone) + qDebug() << "revealZone=" << revealZone << "writeable=" << writeableRevealZone; + if (!(revealZone && !writeableRevealZone)) origZone->setView(this); } @@ -21,7 +22,7 @@ ZoneViewZone::~ZoneViewZone() { emit beingDeleted(); qDebug("ZoneViewZone destructor"); - if (!revealZone) + if (!(revealZone && !writeableRevealZone)) origZone->setView(NULL); } @@ -135,6 +136,7 @@ void ZoneViewZone::addCardImpl(CardItem *card, int x, int /*y*/) void ZoneViewZone::handleDropEvent(const QList &dragItems, CardZone *startZone, const QPoint &/*dropPoint*/) { Command_MoveCard cmd; + cmd.set_start_player_id(startZone->getPlayer()->getId()); cmd.set_start_zone(startZone->getName().toStdString()); cmd.set_target_player_id(player->getId()); cmd.set_target_zone(getName().toStdString()); @@ -168,3 +170,14 @@ QSizeF ZoneViewZone::sizeHint(Qt::SizeHint /*which*/, const QSizeF & /*constrain { return optimumRect.size(); } + +void ZoneViewZone::setWriteableRevealZone(bool _writeableRevealZone) +{ + if (writeableRevealZone && !_writeableRevealZone) + origZone->setView(this); + else if (!writeableRevealZone && _writeableRevealZone) + origZone->setView(NULL); + + writeableRevealZone = _writeableRevealZone; + +} diff --git a/cockatrice/src/zoneviewzone.h b/cockatrice/src/zoneviewzone.h index 75d48d8e6..aab0d0f5b 100644 --- a/cockatrice/src/zoneviewzone.h +++ b/cockatrice/src/zoneviewzone.h @@ -15,10 +15,10 @@ private: int minRows, numberCards; void handleDropEvent(const QList &dragItems, CardZone *startZone, const QPoint &dropPoint); CardZone *origZone; - bool revealZone; + bool revealZone, writeableRevealZone; bool sortByName, sortByType; public: - ZoneViewZone(Player *_p, CardZone *_origZone, int _numberCards = -1, bool _revealZone = false, QGraphicsItem *parent = 0); + ZoneViewZone(Player *_p, CardZone *_origZone, int _numberCards = -1, bool _revealZone = false, bool _writeableRevealZone = false, QGraphicsItem *parent = 0); ~ZoneViewZone(); QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); @@ -28,6 +28,9 @@ public: int getNumberCards() const { return numberCards; } void setGeometry(const QRectF &rect); QRectF getOptimumRect() const { return optimumRect; } + bool getRevealZone() const { return revealZone; } + bool getWriteableRevealZone() const { return writeableRevealZone; } + void setWriteableRevealZone(bool _writeableRevealZone); public slots: void setSortByName(int _sortByName); void setSortByType(int _sortByType); diff --git a/common/pb/command_move_card.proto b/common/pb/command_move_card.proto index 401c5a480..315d64235 100644 --- a/common/pb/command_move_card.proto +++ b/common/pb/command_move_card.proto @@ -14,11 +14,12 @@ message Command_MoveCard { extend GameCommand { optional Command_MoveCard ext = 1027; } - optional string start_zone = 1; - optional ListOfCardsToMove cards_to_move = 2; - optional sint32 target_player_id = 3 [default = -1]; - optional string target_zone = 4; - optional sint32 x = 5 [default = -1]; - optional sint32 y = 6 [default = -1]; + optional sint32 start_player_id = 1 [default = -1]; + optional string start_zone = 2; + optional ListOfCardsToMove cards_to_move = 3; + optional sint32 target_player_id = 4 [default = -1]; + optional string target_zone = 5; + optional sint32 x = 6 [default = -1]; + optional sint32 y = 7 [default = -1]; } diff --git a/common/pb/command_reveal_cards.proto b/common/pb/command_reveal_cards.proto index 6f59a92b1..af108abce 100644 --- a/common/pb/command_reveal_cards.proto +++ b/common/pb/command_reveal_cards.proto @@ -6,4 +6,5 @@ message Command_RevealCards { optional string zone_name = 1; optional sint32 card_id = 2 [default = -1]; optional sint32 player_id = 3 [default = -1]; + optional bool grant_write_access = 4; } diff --git a/common/pb/event_move_card.proto b/common/pb/event_move_card.proto index 27ba18d56..048f3a8d9 100644 --- a/common/pb/event_move_card.proto +++ b/common/pb/event_move_card.proto @@ -6,12 +6,13 @@ message Event_MoveCard { } optional sint32 card_id = 1 [default = -1]; optional string card_name = 2; - optional string start_zone = 3; - optional sint32 position = 4 [default = -1]; - optional sint32 target_player_id = 5 [default = -1]; - optional string target_zone = 6; - optional sint32 x = 7 [default = -1]; - optional sint32 y = 8 [default = -1]; - optional sint32 new_card_id = 9 [default = -1]; - optional bool face_down = 10; + optional sint32 start_player_id = 3 [default = -1]; + optional string start_zone = 4; + optional sint32 position = 5 [default = -1]; + optional sint32 target_player_id = 6 [default = -1]; + optional string target_zone = 7; + optional sint32 x = 8 [default = -1]; + optional sint32 y = 9 [default = -1]; + optional sint32 new_card_id = 10 [default = -1]; + optional bool face_down = 11; } diff --git a/common/pb/event_reveal_cards.proto b/common/pb/event_reveal_cards.proto index 294852631..1bb386e2d 100644 --- a/common/pb/event_reveal_cards.proto +++ b/common/pb/event_reveal_cards.proto @@ -9,4 +9,5 @@ message Event_RevealCards { optional sint32 card_id = 2 [default = -1]; optional sint32 other_player_id = 3 [default = -1]; repeated ServerInfo_Card cards = 4; + optional bool grant_write_access = 5; } diff --git a/common/server_cardzone.cpp b/common/server_cardzone.cpp index 6cc7714ce..a16200ecc 100644 --- a/common/server_cardzone.cpp +++ b/common/server_cardzone.cpp @@ -43,6 +43,8 @@ void Server_CardZone::shuffle() for (int i = cards.size(); i; i--) temp.append(cards.takeAt(rng->getNumber(0, i - 1))); cards = temp; + + playersWithWritePermission.clear(); } int Server_CardZone::removeCard(Server_Card *card) @@ -206,4 +208,10 @@ void Server_CardZone::clear() for (int i = 0; i < cards.size(); i++) delete cards.at(i); cards.clear(); + playersWithWritePermission.clear(); +} + +void Server_CardZone::addWritePermission(int playerId) +{ + playersWithWritePermission.insert(playerId); } diff --git a/common/server_cardzone.h b/common/server_cardzone.h index c4a1f9985..e61543a77 100644 --- a/common/server_cardzone.h +++ b/common/server_cardzone.h @@ -23,6 +23,7 @@ #include #include #include +#include #include "pb/serverinfo_zone.pb.h" class Server_Card; @@ -37,6 +38,7 @@ private: bool has_coords; ServerInfo_Zone::ZoneType type; int cardsBeingLookedAt; + QSet playersWithWritePermission; public: Server_CardZone(Server_Player *_player, const QString &_name, bool _has_coords, ServerInfo_Zone::ZoneType _type); ~Server_CardZone(); @@ -60,6 +62,8 @@ public: void insertCard(Server_Card *card, int x, int y); void shuffle(); void clear(); + void addWritePermission(int playerId); + const QSet &getPlayersWithWritePermission() const { return playersWithWritePermission; } }; #endif diff --git a/common/server_player.cpp b/common/server_player.cpp index c21c720c2..39b6e6daa 100644 --- a/common/server_player.cpp +++ b/common/server_player.cpp @@ -342,21 +342,6 @@ Response::ResponseCode Server_Player::undoDraw(GameEventStorage &ges) return retVal; } -Response::ResponseCode Server_Player::moveCard(GameEventStorage &ges, const QString &_startZone, const QList &_cards, int targetPlayerId, const QString &_targetZone, int x, int y) -{ - QMutexLocker locker(&game->gameMutex); - - Server_CardZone *startzone = getZones().value(_startZone); - Server_Player *targetPlayer = game->getPlayers().value(targetPlayerId); - if (!targetPlayer) - return Response::RespNameNotFound; - Server_CardZone *targetzone = targetPlayer->getZones().value(_targetZone); - if ((!startzone) || (!targetzone)) - return Response::RespNameNotFound; - - return moveCard(ges, startzone, _cards, targetzone, x, y); -} - class Server_Player::MoveCardCompareFunctor { private: int x; @@ -510,6 +495,7 @@ Response::ResponseCode Server_Player::moveCard(GameEventStorage &ges, Server_Car privatePosition = position; Event_MoveCard eventOthers; + eventOthers.set_start_player_id(startzone->getPlayer()->getPlayerId()); eventOthers.set_start_zone(startzone->getName().toStdString()); eventOthers.set_target_player_id(targetzone->getPlayer()->getPlayerId()); if (startzone != targetzone) @@ -858,11 +844,31 @@ Response::ResponseCode Server_Player::cmdMoveCard(const Command_MoveCard &cmd, R if (conceded) return Response::RespContextError; + Server_Player *startPlayer = game->getPlayers().value(cmd.has_start_player_id() ? cmd.start_player_id() : playerId); + if (!startPlayer) + return Response::RespNameNotFound; + Server_CardZone *startZone = startPlayer->getZones().value(QString::fromStdString(cmd.start_zone())); + if (!startZone) + return Response::RespNameNotFound; + + if ((startPlayer != this) && (!startZone->getPlayersWithWritePermission().contains(playerId))) + return Response::RespContextError; + + Server_Player *targetPlayer = game->getPlayers().value(cmd.target_player_id()); + if (!targetPlayer) + return Response::RespNameNotFound; + Server_CardZone *targetZone = targetPlayer->getZones().value(QString::fromStdString(cmd.target_zone())); + if (!targetZone) + return Response::RespNameNotFound; + + if ((startPlayer != this) && (targetPlayer != this)) + return Response::RespContextError; + QList cardsToMove; for (int i = 0; i < cmd.cards_to_move().card_size(); ++i) cardsToMove.append(&cmd.cards_to_move().card(i)); - return moveCard(ges, QString::fromStdString(cmd.start_zone()), cardsToMove, cmd.target_player_id(), QString::fromStdString(cmd.target_zone()), cmd.x(), cmd.y()); + return moveCard(ges, startZone, cardsToMove, targetZone, cmd.x(), cmd.y()); } Response::ResponseCode Server_Player::cmdFlipCard(const Command_FlipCard &cmd, ResponseContainer & /*rc*/, GameEventStorage &ges) @@ -1470,6 +1476,7 @@ Response::ResponseCode Server_Player::cmdRevealCards(const Command_RevealCards & } Event_RevealCards eventOthers; + eventOthers.set_grant_write_access(cmd.grant_write_access()); eventOthers.set_zone_name(zone->getName().toStdString()); if (cmd.has_card_id()) eventOthers.set_card_id(cmd.card_id()); @@ -1511,10 +1518,20 @@ Response::ResponseCode Server_Player::cmdRevealCards(const Command_RevealCards & } if (cmd.has_player_id()) { + if (cmd.grant_write_access()) + zone->addWritePermission(cmd.player_id()); + ges.enqueueGameEvent(eventPrivate, playerId, GameEventStorageItem::SendToPrivate, cmd.player_id()); ges.enqueueGameEvent(eventOthers, playerId, GameEventStorageItem::SendToOthers); - } else + } else { + if (cmd.grant_write_access()) { + const QList &playerIds = game->getPlayers().keys(); + for (int i = 0; i < playerIds.size(); ++i) + zone->addWritePermission(playerIds[i]); + } + ges.enqueueGameEvent(eventPrivate, playerId); + } return Response::RespOk; } diff --git a/common/server_player.h b/common/server_player.h index 927e69c19..205b454f2 100644 --- a/common/server_player.h +++ b/common/server_player.h @@ -117,7 +117,6 @@ public: Response::ResponseCode drawCards(GameEventStorage &ges, int number); Response::ResponseCode undoDraw(GameEventStorage &ges); - Response::ResponseCode moveCard(GameEventStorage &ges, const QString &_startZone, const QList &_cards, int _targetPlayer, const QString &_targetZone, int _x, int _y); Response::ResponseCode moveCard(GameEventStorage &ges, Server_CardZone *startzone, const QList &_cards, Server_CardZone *targetzone, int x, int y, bool fixFreeSpaces = true, bool undoingDraw = false); void unattachCard(GameEventStorage &ges, Server_Card *card); Response::ResponseCode setCardAttrHelper(GameEventStorage &ges, const QString &zone, int cardId, CardAttribute attribute, const QString &attrValue); diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 1aa2c27be..18c7710b5 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -194,8 +194,6 @@ Response::ResponseCode Server_ProtocolHandler::processGameCommandContainer(const if (authState == NotLoggedIn) return Response::RespLoginNeeded; - qDebug() << QString::fromStdString(cont.DebugString()); - QMap > gameMap = getGames(); if (!gameMap.contains(cont.game_id())) return Response::RespNotInRoom;