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.

This commit is contained in:
Max-Wilhelm Bruker
2012-03-24 17:48:25 +01:00
parent 2ce18a82f5
commit adbb607700
30 changed files with 231 additions and 101 deletions

View File

@@ -31,6 +31,7 @@ signals:
void hovered(AbstractCardItem *card); void hovered(AbstractCardItem *card);
void showCardInfoPopup(QPoint pos, QString cardName); void showCardInfoPopup(QPoint pos, QString cardName);
void deleteCardInfoPopup(QString cardName); void deleteCardInfoPopup(QString cardName);
void updateCardMenu(AbstractCardItem *card, QMenu *cardMenu, QMenu *ptMenu, QMenu *moveMenu);
public: public:
enum { Type = typeCard }; enum { Type = typeCard };
int type() const { return Type; } int type() const { return Type; }

View File

@@ -8,6 +8,7 @@
#include "carddragitem.h" #include "carddragitem.h"
#include "carddatabase.h" #include "carddatabase.h"
#include "cardzone.h" #include "cardzone.h"
#include "zoneviewzone.h"
#include "tablezone.h" #include "tablezone.h"
#include "player.h" #include "player.h"
#include "arrowitem.h" #include "arrowitem.h"
@@ -26,7 +27,7 @@ CardItem::CardItem(Player *_owner, const QString &_name, int _cardid, bool _reve
moveMenu = new QMenu; moveMenu = new QMenu;
retranslateUi(); retranslateUi();
owner->updateCardMenu(this, cardMenu, ptMenu, moveMenu); emit updateCardMenu(this, cardMenu, ptMenu, moveMenu);
} }
CardItem::~CardItem() CardItem::~CardItem()
@@ -45,7 +46,7 @@ void CardItem::prepareDelete()
if (owner) { if (owner) {
if (owner->getCardMenu() == cardMenu) { if (owner->getCardMenu() == cardMenu) {
owner->setCardMenu(0); owner->setCardMenu(0);
owner->setActiveCard(0); owner->getGame()->setActiveCard(0);
} }
owner = 0; owner = 0;
} }
@@ -70,7 +71,7 @@ void CardItem::deleteLater()
void CardItem::setZone(CardZone *_zone) void CardItem::setZone(CardZone *_zone)
{ {
zone = _zone; zone = _zone;
owner->updateCardMenu(this, cardMenu, ptMenu, moveMenu); emit updateCardMenu(this, cardMenu, ptMenu, moveMenu);
} }
void CardItem::retranslateUi() void CardItem::retranslateUi()
@@ -183,7 +184,7 @@ void CardItem::setAttachedTo(CardItem *_attachedTo)
if (zone) if (zone)
zone->reorganizeCards(); zone->reorganizeCards();
owner->updateCardMenu(this, cardMenu, ptMenu, moveMenu); emit updateCardMenu(this, cardMenu, ptMenu, moveMenu);
} }
void CardItem::resetState() void CardItem::resetState()
@@ -283,7 +284,11 @@ void CardItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
} else if (event->buttons().testFlag(Qt::LeftButton)) { } else if (event->buttons().testFlag(Qt::LeftButton)) {
if ((event->screenPos() - event->buttonDownScreenPos(Qt::LeftButton)).manhattanLength() < 2 * QApplication::startDragDistance()) if ((event->screenPos() - event->buttonDownScreenPos(Qt::LeftButton)).manhattanLength() < 2 * QApplication::startDragDistance())
return; return;
if (!owner->getLocal()) if (zone->getIsView()) {
const ZoneViewZone *const view = static_cast<const ZoneViewZone *const>(zone);
if (view->getRevealZone() && !view->getWriteableRevealZone())
return;
} else if (!owner->getLocal())
return; return;
bool forceFaceDown = event->modifiers().testFlag(Qt::ShiftModifier); bool forceFaceDown = event->modifiers().testFlag(Qt::ShiftModifier);
@@ -332,7 +337,14 @@ void CardItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
cardMenu->exec(event->screenPos()); cardMenu->exec(event->screenPos());
} else if ((event->button() == Qt::LeftButton) && !settingsCache->getDoubleClickToPlay()) { } else if ((event->button() == Qt::LeftButton) && !settingsCache->getDoubleClickToPlay()) {
setCursor(Qt::OpenHandCursor); setCursor(Qt::OpenHandCursor);
if (revealedCard)
bool hideCard = false;
if (zone->getIsView()) {
ZoneViewZone *view = static_cast<ZoneViewZone *>(zone);
if (view->getRevealZone() && !view->getWriteableRevealZone())
hideCard = true;
}
if (hideCard)
zone->removeCard(this); zone->removeCard(this);
else else
playCard(event->modifiers().testFlag(Qt::ShiftModifier)); playCard(event->modifiers().testFlag(Qt::ShiftModifier));
@@ -374,10 +386,10 @@ QVariant CardItem::itemChange(GraphicsItemChange change, const QVariant &value)
if ((change == ItemSelectedHasChanged) && owner) { if ((change == ItemSelectedHasChanged) && owner) {
if (value == true) { if (value == true) {
owner->setCardMenu(cardMenu); owner->setCardMenu(cardMenu);
owner->setActiveCard(this); owner->getGame()->setActiveCard(this);
} else if (owner->getCardMenu() == cardMenu) { } else if (owner->getCardMenu() == cardMenu) {
owner->setCardMenu(0); owner->setCardMenu(0);
owner->setActiveCard(0); owner->getGame()->setActiveCard(0);
} }
} }
return QGraphicsItem::itemChange(change, value); return QGraphicsItem::itemChange(change, value);

View File

@@ -74,7 +74,6 @@ public:
const QList<CardItem *> &getAttachedCards() const { return attachedCards; } const QList<CardItem *> &getAttachedCards() const { return attachedCards; }
void resetState(); void resetState();
void processCardInfo(const ServerInfo_Card &info); void processCardInfo(const ServerInfo_Card &info);
void updateCardMenu();
bool animationEvent(); bool animationEvent();
CardDragItem *createDragItem(int _id, const QPointF &_pos, const QPointF &_scenePos, bool faceDown); CardDragItem *createDragItem(int _id, const QPointF &_pos, const QPointF &_scenePos, bool faceDown);

View File

@@ -9,8 +9,8 @@
#include "pb/command_move_card.pb.h" #include "pb/command_move_card.pb.h"
#include "pb/serverinfo_user.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) 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) : AbstractGraphicsItem(parent), player(_p), name(_name), cards(_contentsKnown), view(NULL), menu(NULL), doubleClickAction(0), hasCardAttr(_hasCardAttr), isShufflable(_isShufflable), isView(_isView)
{ {
if (!isView) if (!isView)
player->addZone(this); player->addZone(this);

View File

@@ -24,6 +24,7 @@ protected:
QAction *doubleClickAction; QAction *doubleClickAction;
bool hasCardAttr; bool hasCardAttr;
bool isShufflable; bool isShufflable;
bool isView;
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
void mousePressEvent(QGraphicsSceneMouseEvent *event); void mousePressEvent(QGraphicsSceneMouseEvent *event);
virtual void addCardImpl(CardItem *card, int x, int y) = 0; virtual void addCardImpl(CardItem *card, int x, int y) = 0;
@@ -36,7 +37,7 @@ public:
enum { Type = typeZone }; enum { Type = typeZone };
int type() const { return Type; } int type() const { return Type; }
virtual void handleDropEvent(const QList<CardDragItem *> &dragItem, CardZone *startZone, const QPoint &dropPoint) = 0; virtual void handleDropEvent(const QList<CardDragItem *> &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(); ~CardZone();
void retranslateUi(); void retranslateUi();
void clearContents(); void clearContents();
@@ -59,6 +60,7 @@ public:
void setView(ZoneViewZone *_view) { view = _view; } void setView(ZoneViewZone *_view) { view = _view; }
virtual void reorganizeCards() = 0; virtual void reorganizeCards() = 0;
virtual QPointF closestGridPoint(const QPointF &point); virtual QPointF closestGridPoint(const QPointF &point);
bool getIsView() const { return isView; }
}; };
#endif #endif

View File

@@ -128,9 +128,9 @@ void GameScene::toggleZoneView(Player *player, const QString &zoneName, int numb
item->setPos(50, 50); item->setPos(50, 50);
} }
void GameScene::addRevealedZoneView(Player *player, CardZone *zone, const QList<const ServerInfo_Card *> &cardList) void GameScene::addRevealedZoneView(Player *player, CardZone *zone, const QList<const ServerInfo_Card *> &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); zoneViews.append(item);
connect(item, SIGNAL(closePressed(ZoneViewWidget *)), this, SLOT(removeZoneView(ZoneViewWidget *))); connect(item, SIGNAL(closePressed(ZoneViewWidget *)), this, SLOT(removeZoneView(ZoneViewWidget *)));
addItem(item); addItem(item);

View File

@@ -45,7 +45,7 @@ public:
void unregisterAnimationItem(AbstractCardItem *card); void unregisterAnimationItem(AbstractCardItem *card);
public slots: public slots:
void toggleZoneView(Player *player, const QString &zoneName, int numberCards); void toggleZoneView(Player *player, const QString &zoneName, int numberCards);
void addRevealedZoneView(Player *player, CardZone *zone, const QList<const ServerInfo_Card *> &cardList); void addRevealedZoneView(Player *player, CardZone *zone, const QList<const ServerInfo_Card *> &cardList, bool withWritePermission);
void removeZoneView(ZoneViewWidget *item); void removeZoneView(ZoneViewWidget *item);
void addPlayer(Player *player); void addPlayer(Player *player);
void removePlayer(Player *player); void removePlayer(Player *player);

View File

@@ -42,6 +42,7 @@ void HandZone::addCardImpl(CardItem *card, int x, int /*y*/)
void HandZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &/*dropPoint*/) void HandZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &/*dropPoint*/)
{ {
Command_MoveCard cmd; Command_MoveCard cmd;
cmd.set_start_player_id(startZone->getPlayer()->getId());
cmd.set_start_zone(startZone->getName().toStdString()); cmd.set_start_zone(startZone->getName().toStdString());
cmd.set_target_player_id(player->getId()); cmd.set_target_player_id(player->getId());
cmd.set_target_zone(getName().toStdString()); cmd.set_target_zone(getName().toStdString());

View File

@@ -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("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName)))); appendHtml((isFemale(player) ? tr("%1 undoes her last draw (%2).") : tr("%1 undoes his last draw (%2).")).arg(sanitizeHtml(player->getName())).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName))));
} }
QPair<QString, QString> MessageLogWidget::getFromStr(CardZone *zone, QString cardName, int position) const QPair<QString, QString> MessageLogWidget::getFromStr(CardZone *zone, QString cardName, int position, bool ownerChange) const
{ {
bool cardNameContainsStartZone = false; bool cardNameContainsStartZone = false;
QString fromStr; QString fromStr;
@@ -188,18 +188,36 @@ QPair<QString, QString> MessageLogWidget::getFromStr(CardZone *zone, QString car
else if (startName == "deck") { else if (startName == "deck") {
if (position >= zone->getCards().size() - 1) { if (position >= zone->getCards().size() - 1) {
if (cardName.isEmpty()) { 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; cardNameContainsStartZone = true;
} else } else {
fromStr = isFemale(zone->getPlayer()) ? tr(" from the bottom of her library") : tr(" from the bottom of his library"); 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) { } else if (position == 0) {
if (cardName.isEmpty()) { 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; cardNameContainsStartZone = true;
} else } else {
fromStr = isFemale(zone->getPlayer()) ? tr(" from the top of her library") : tr(" from the top of his library"); if (ownerChange)
} else fromStr = tr(" from the top of %1's library").arg(zone->getPlayer()->getName());
fromStr = tr(" from library"); 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") } else if (startName == "sb")
fromStr = tr(" from sideboard"); fromStr = tr(" from sideboard");
else if (startName == "stack") else if (startName == "stack")
@@ -212,12 +230,13 @@ QPair<QString, QString> MessageLogWidget::getFromStr(CardZone *zone, QString car
void MessageLogWidget::doMoveCard(LogMoveCard &attributes) void MessageLogWidget::doMoveCard(LogMoveCard &attributes)
{ {
bool ownerChange = attributes.startZone->getPlayer() != attributes.targetZone->getPlayer();
QString startName = attributes.startZone->getName(); QString startName = attributes.startZone->getName();
QString targetName = attributes.targetZone->getName(); QString targetName = attributes.targetZone->getName();
if (((startName == "table") && (targetName == "table") && (attributes.startZone == attributes.targetZone)) || ((startName == "hand") && (targetName == "hand"))) if (((startName == "table") && (targetName == "table") && (attributes.startZone == attributes.targetZone)) || ((startName == "hand") && (targetName == "hand")))
return; return;
QString cardName = attributes.cardName; QString cardName = attributes.cardName;
QPair<QString, QString> temp = getFromStr(attributes.startZone, cardName, attributes.oldX); QPair<QString, QString> temp = getFromStr(attributes.startZone, cardName, attributes.oldX, ownerChange);
bool cardNameContainsStartZone = false; bool cardNameContainsStartZone = false;
if (!temp.first.isEmpty()) { if (!temp.first.isEmpty()) {
cardNameContainsStartZone = true; cardNameContainsStartZone = true;
@@ -231,8 +250,8 @@ void MessageLogWidget::doMoveCard(LogMoveCard &attributes)
cardStr = tr("a card"); cardStr = tr("a card");
else else
cardStr = QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName)); cardStr = QString("<font color=\"blue\">%1</font>").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)); appendHtml(tr("%1 gives %2 control over %3.").arg(sanitizeHtml(attributes.player->getName())).arg(sanitizeHtml(attributes.targetZone->getPlayer()->getName())).arg(cardStr));
return; 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) void MessageLogWidget::logRevealCards(Player *player, CardZone *zone, int cardId, QString cardName, Player *otherPlayer)
{ {
QPair<QString, QString> temp = getFromStr(zone, cardName, cardId); QPair<QString, QString> temp = getFromStr(zone, cardName, cardId, false);
bool cardNameContainsStartZone = false; bool cardNameContainsStartZone = false;
if (!temp.first.isEmpty()) { if (!temp.first.isEmpty()) {
cardNameContainsStartZone = true; cardNameContainsStartZone = true;

View File

@@ -28,7 +28,7 @@ private:
QString sanitizeHtml(QString dirty) const; QString sanitizeHtml(QString dirty) const;
bool isFemale(Player *player) const; bool isFemale(Player *player) const;
QPair<QString, QString> getFromStr(CardZone *zone, QString cardName, int position) const; QPair<QString, QString> getFromStr(CardZone *zone, QString cardName, int position, bool ownerChange) const;
MessageContext currentContext; MessageContext currentContext;
bool female; bool female;

View File

@@ -53,6 +53,7 @@ void PileZone::addCardImpl(CardItem *card, int x, int /*y*/)
void PileZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &/*dropPoint*/) void PileZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &/*dropPoint*/)
{ {
Command_MoveCard cmd; Command_MoveCard cmd;
cmd.set_start_player_id(startZone->getPlayer()->getId());
cmd.set_start_zone(startZone->getName().toStdString()); cmd.set_start_zone(startZone->getName().toStdString());
cmd.set_target_player_id(player->getId()); cmd.set_target_player_id(player->getId());
cmd.set_target_zone(getName().toStdString()); cmd.set_target_zone(getName().toStdString());

View File

@@ -93,7 +93,7 @@ void PlayerArea::setSize(qreal width, qreal height)
} }
Player::Player(const ServerInfo_User &info, int _id, bool _local, TabGame *_parent) 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 = new ServerInfo_User;
userInfo->CopyFrom(info); 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())); connect(tempSetCounter, SIGNAL(triggered()), this, SLOT(actCardCounterTrigger()));
} }
const QList<Player *> &players = _parent->getPlayers().values(); const QList<Player *> &players = game->getPlayers().values();
for (int i = 0; i < players.size(); ++i) for (int i = 0; i < players.size(); ++i)
addPlayer(players[i]); addPlayer(players[i]);
@@ -460,9 +460,10 @@ void Player::playerListActionTriggered()
if (otherPlayerId != -1) if (otherPlayerId != -1)
cmd.set_player_id(otherPlayerId); cmd.set_player_id(otherPlayerId);
if (menu == mRevealLibrary) if (menu == mRevealLibrary) {
cmd.set_zone_name("deck"); 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_zone_name("deck");
cmd.set_card_id(0); cmd.set_card_id(0);
} else if (menu == mRevealHand) } else if (menu == mRevealHand)
@@ -937,6 +938,9 @@ void Player::eventShuffle(const Event_Shuffle &event)
CardZone *zone = zones.value(QString::fromStdString(event.zone_name())); CardZone *zone = zones.value(QString::fromStdString(event.zone_name()));
if (!zone) if (!zone)
return; return;
if (zone->getView())
if (zone->getView()->getRevealZone())
zone->getView()->setWriteableRevealZone(false);
emit logShuffle(this, zone); emit logShuffle(this, zone);
} }
@@ -1040,7 +1044,7 @@ void Player::eventDelCounter(const Event_DelCounter &event)
void Player::eventDumpZone(const Event_DumpZone &event) void Player::eventDumpZone(const Event_DumpZone &event)
{ {
Player *zoneOwner = static_cast<TabGame *>(parent())->getPlayers().value(event.zone_owner_id(), 0); Player *zoneOwner = game->getPlayers().value(event.zone_owner_id(), 0);
if (!zoneOwner) if (!zoneOwner)
return; return;
CardZone *zone = zoneOwner->getZones().value(QString::fromStdString(event.zone_name()), 0); 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) void Player::eventStopDumpZone(const Event_StopDumpZone &event)
{ {
Player *zoneOwner = static_cast<TabGame *>(parent())->getPlayers().value(event.zone_owner_id(), 0); Player *zoneOwner = game->getPlayers().value(event.zone_owner_id(), 0);
if (!zoneOwner) if (!zoneOwner)
return; return;
CardZone *zone = zoneOwner->getZones().value(QString::fromStdString(event.zone_name()), 0); 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) void Player::eventMoveCard(const Event_MoveCard &event, const GameEventContext &context)
{ {
CardZone *startZone = zones.value(QString::fromStdString(event.start_zone()), 0); Player *startPlayer = game->getPlayers().value(event.start_player_id());
Player *targetPlayer = static_cast<TabGame *>(parent())->getPlayers().value(event.target_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) if (!targetPlayer)
return; return;
CardZone *targetZone; CardZone *targetZone;
@@ -1122,7 +1129,7 @@ void Player::eventMoveCard(const Event_MoveCard &event, const GameEventContext &
// Look at all arrows from and to the card. // Look at all arrows from and to the card.
// If the card was moved to another zone, delete the arrows, otherwise update them. // If the card was moved to another zone, delete the arrows, otherwise update them.
QMapIterator<int, Player *> playerIterator(static_cast<TabGame *>(parent())->getPlayers()); QMapIterator<int, Player *> playerIterator(game->getPlayers());
while (playerIterator.hasNext()) { while (playerIterator.hasNext()) {
Player *p = playerIterator.next().value(); Player *p = playerIterator.next().value();
@@ -1176,7 +1183,7 @@ void Player::eventDestroyCard(const Event_DestroyCard &event)
void Player::eventAttachCard(const Event_AttachCard &event) void Player::eventAttachCard(const Event_AttachCard &event)
{ {
const QMap<int, Player *> &playerList = static_cast<TabGame *>(parent())->getPlayers(); const QMap<int, Player *> &playerList = game->getPlayers();
Player *targetPlayer = 0; Player *targetPlayer = 0;
CardZone *targetZone = 0; CardZone *targetZone = 0;
CardItem *targetCard = 0; CardItem *targetCard = 0;
@@ -1244,7 +1251,7 @@ void Player::eventRevealCards(const Event_RevealCards &event)
return; return;
Player *otherPlayer = 0; Player *otherPlayer = 0;
if (event.has_other_player_id()) { if (event.has_other_player_id()) {
otherPlayer = static_cast<TabGame *>(parent())->getPlayers().value(event.other_player_id()); otherPlayer = game->getPlayers().value(event.other_player_id());
if (!otherPlayer) if (!otherPlayer)
return; return;
} }
@@ -1256,7 +1263,7 @@ void Player::eventRevealCards(const Event_RevealCards &event)
cardList.append(temp); cardList.append(temp);
} }
if (!cardList.isEmpty()) if (!cardList.isEmpty())
static_cast<GameScene *>(scene())->addRevealedZoneView(this, zone, cardList); static_cast<GameScene *>(scene())->addRevealedZoneView(this, zone, cardList, event.grant_write_access());
QString cardName; QString cardName;
if (cardList.size() == 1) if (cardList.size() == 1)
@@ -1364,7 +1371,7 @@ void Player::processCardAttachment(const ServerInfo_Player &info)
const ServerInfo_Card &cardInfo = zoneInfo.card_list(j); const ServerInfo_Card &cardInfo = zoneInfo.card_list(j);
if (cardInfo.has_attach_player_id()) { if (cardInfo.has_attach_player_id()) {
CardItem *startCard = zone->getCard(cardInfo.id(), QString()); CardItem *startCard = zone->getCard(cardInfo.id(), QString());
CardItem *targetCard = static_cast<TabGame *>(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) if (!targetCard)
continue; continue;
@@ -1377,6 +1384,7 @@ void Player::processCardAttachment(const ServerInfo_Player &info)
void Player::playCard(CardItem *c, bool faceDown, bool tapped) void Player::playCard(CardItem *c, bool faceDown, bool tapped)
{ {
Command_MoveCard cmd; Command_MoveCard cmd;
cmd.set_start_player_id(c->getZone()->getPlayer()->getId());
cmd.set_start_zone(c->getZone()->getName().toStdString()); cmd.set_start_zone(c->getZone()->getName().toStdString());
cmd.set_target_player_id(getId()); cmd.set_target_player_id(getId());
CardToMove *cardToMove = cmd.mutable_cards_to_move()->add_card(); CardToMove *cardToMove = cmd.mutable_cards_to_move()->add_card();
@@ -1465,7 +1473,7 @@ void Player::clearCounters()
ArrowItem *Player::addArrow(const ServerInfo_Arrow &arrow) ArrowItem *Player::addArrow(const ServerInfo_Arrow &arrow)
{ {
const QMap<int, Player *> &playerList = static_cast<TabGame *>(parent())->getPlayers(); const QMap<int, Player *> &playerList = game->getPlayers();
Player *startPlayer = playerList.value(arrow.start_player_id(), 0); Player *startPlayer = playerList.value(arrow.start_player_id(), 0);
Player *targetPlayer = playerList.value(arrow.target_player_id(), 0); Player *targetPlayer = playerList.value(arrow.target_player_id(), 0);
if (!startPlayer || !targetPlayer) if (!startPlayer || !targetPlayer)
@@ -1552,22 +1560,22 @@ void Player::rearrangeCounters()
PendingCommand * Player::prepareGameCommand(const google::protobuf::Message &cmd) PendingCommand * Player::prepareGameCommand(const google::protobuf::Message &cmd)
{ {
return static_cast<TabGame *>(parent())->prepareGameCommand(cmd); return game->prepareGameCommand(cmd);
} }
PendingCommand * Player::prepareGameCommand(const QList<const::google::protobuf::Message *> &cmdList) PendingCommand * Player::prepareGameCommand(const QList<const::google::protobuf::Message *> &cmdList)
{ {
return static_cast<TabGame *>(parent())->prepareGameCommand(cmdList); return game->prepareGameCommand(cmdList);
} }
void Player::sendGameCommand(const google::protobuf::Message &command) void Player::sendGameCommand(const google::protobuf::Message &command)
{ {
static_cast<TabGame *>(parent())->sendGameCommand(command, id); game->sendGameCommand(command, id);
} }
void Player::sendGameCommand(PendingCommand *pend) void Player::sendGameCommand(PendingCommand *pend)
{ {
static_cast<TabGame *>(parent())->sendGameCommand(pend, id); game->sendGameCommand(pend, id);
} }
bool Player::clearCardsToDelete() bool Player::clearCardsToDelete()
@@ -1651,11 +1659,13 @@ void Player::cardMenuAction()
ListOfCardsToMove idList; ListOfCardsToMove idList;
for (int i = 0; i < cardList.size(); ++i) for (int i = 0; i < cardList.size(); ++i)
idList.add_card()->set_card_id(cardList[i]->getId()); idList.add_card()->set_card_id(cardList[i]->getId());
int startPlayerId = cardList[0]->getZone()->getPlayer()->getId();
QString startZone = cardList[0]->getZone()->getName(); QString startZone = cardList[0]->getZone()->getName();
switch (a->data().toInt()) { switch (a->data().toInt()) {
case 5: { case 5: {
Command_MoveCard *cmd = new Command_MoveCard; Command_MoveCard *cmd = new Command_MoveCard;
cmd->set_start_player_id(startPlayerId);
cmd->set_start_zone(startZone.toStdString()); cmd->set_start_zone(startZone.toStdString());
cmd->mutable_cards_to_move()->CopyFrom(idList); cmd->mutable_cards_to_move()->CopyFrom(idList);
cmd->set_target_player_id(getId()); cmd->set_target_player_id(getId());
@@ -1667,6 +1677,7 @@ void Player::cardMenuAction()
} }
case 6: { case 6: {
Command_MoveCard *cmd = new Command_MoveCard; Command_MoveCard *cmd = new Command_MoveCard;
cmd->set_start_player_id(startPlayerId);
cmd->set_start_zone(startZone.toStdString()); cmd->set_start_zone(startZone.toStdString());
cmd->mutable_cards_to_move()->CopyFrom(idList); cmd->mutable_cards_to_move()->CopyFrom(idList);
cmd->set_target_player_id(getId()); cmd->set_target_player_id(getId());
@@ -1678,6 +1689,7 @@ void Player::cardMenuAction()
} }
case 7: { case 7: {
Command_MoveCard *cmd = new Command_MoveCard; Command_MoveCard *cmd = new Command_MoveCard;
cmd->set_start_player_id(startPlayerId);
cmd->set_start_zone(startZone.toStdString()); cmd->set_start_zone(startZone.toStdString());
cmd->mutable_cards_to_move()->CopyFrom(idList); cmd->mutable_cards_to_move()->CopyFrom(idList);
cmd->set_target_player_id(getId()); cmd->set_target_player_id(getId());
@@ -1689,6 +1701,7 @@ void Player::cardMenuAction()
} }
case 8: { case 8: {
Command_MoveCard *cmd = new Command_MoveCard; Command_MoveCard *cmd = new Command_MoveCard;
cmd->set_start_player_id(startPlayerId);
cmd->set_start_zone(startZone.toStdString()); cmd->set_start_zone(startZone.toStdString());
cmd->mutable_cards_to_move()->CopyFrom(idList); cmd->mutable_cards_to_move()->CopyFrom(idList);
cmd->set_target_player_id(getId()); cmd->set_target_player_id(getId());
@@ -1701,7 +1714,7 @@ void Player::cardMenuAction()
default: ; default: ;
} }
} }
static_cast<TabGame *>(parent())->sendGameCommand(prepareGameCommand(commandList)); game->sendGameCommand(prepareGameCommand(commandList));
} }
void Player::actIncPT(int deltaP, int deltaT) void Player::actIncPT(int deltaP, int deltaT)
@@ -1756,7 +1769,7 @@ void Player::actSetPT()
void Player::actDrawArrow() void Player::actDrawArrow()
{ {
activeCard->drawArrow(Qt::red); game->getActiveCard()->drawArrow(Qt::red);
} }
void Player::actIncP() void Player::actIncP()
@@ -1824,7 +1837,7 @@ void Player::actSetAnnotation()
void Player::actAttach() void Player::actAttach()
{ {
ArrowAttachItem *arrow = new ArrowAttachItem(activeCard); ArrowAttachItem *arrow = new ArrowAttachItem(game->getActiveCard());
scene()->addItem(arrow); scene()->addItem(arrow);
arrow->grabMouse(); arrow->grabMouse();
} }
@@ -1832,8 +1845,8 @@ void Player::actAttach()
void Player::actUnattach() void Player::actUnattach()
{ {
Command_AttachCard cmd; Command_AttachCard cmd;
cmd.set_start_zone(activeCard->getZone()->getName().toStdString()); cmd.set_start_zone(game->getActiveCard()->getZone()->getName().toStdString());
cmd.set_card_id(activeCard->getId()); cmd.set_card_id(game->getActiveCard()->getId());
sendGameCommand(cmd); sendGameCommand(cmd);
} }
@@ -1903,21 +1916,34 @@ void Player::actCardCounterTrigger()
void Player::actPlay() void Player::actPlay()
{ {
activeCard->playCard(false); playCard(game->getActiveCard(), false, game->getActiveCard()->getInfo()->getCipt());
} }
void Player::actHide() void Player::actHide()
{ {
activeCard->getZone()->removeCard(activeCard); game->getActiveCard()->getZone()->removeCard(game->getActiveCard());
} }
void Player::updateCardMenu(CardItem *card, QMenu *cardMenu, QMenu *ptMenu, QMenu *moveMenu) void Player::updateCardMenu(CardItem *card, QMenu *cardMenu, QMenu *ptMenu, QMenu *moveMenu)
{ {
cardMenu->clear(); cardMenu->clear();
if (card->getRevealedCard()) bool revealedCard = false;
bool writeableCard = getLocal();
if (card->getZone())
if (card->getZone()->getIsView()) {
ZoneViewZone *view = static_cast<ZoneViewZone *>(card->getZone());
if (view->getRevealZone()) {
if (view->getWriteableRevealZone())
writeableCard = true;
else
revealedCard = true;
}
}
if (revealedCard)
cardMenu->addAction(aHide); cardMenu->addAction(aHide);
else if (getLocal()) { else if (writeableCard) {
if (moveMenu->isEmpty()) { if (moveMenu->isEmpty()) {
moveMenu->addAction(aMoveToTopLibrary); moveMenu->addAction(aMoveToTopLibrary);
moveMenu->addAction(aMoveToBottomLibrary); moveMenu->addAction(aMoveToBottomLibrary);

View File

@@ -148,6 +148,7 @@ private slots:
void actHide(); void actHide();
private: private:
TabGame *game;
QMenu *playerMenu, *handMenu, *graveMenu, *rfgMenu, *libraryMenu, *sbMenu, *countersMenu, *sayMenu, QMenu *playerMenu, *handMenu, *graveMenu, *rfgMenu, *libraryMenu, *sbMenu, *countersMenu, *sayMenu,
*mRevealLibrary, *mRevealTopCard, *mRevealHand, *mRevealRandomHandCard; *mRevealLibrary, *mRevealTopCard, *mRevealHand, *mRevealRandomHandCard;
QList<QMenu *> playerLists; QList<QMenu *> playerLists;
@@ -160,7 +161,6 @@ private:
*aDrawCard, *aDrawCards, *aUndoDraw, *aMulligan, *aShuffle, *aDrawCard, *aDrawCards, *aUndoDraw, *aMulligan, *aShuffle,
*aUntapAll, *aRollDie, *aCreateToken, *aCreateAnotherToken, *aUntapAll, *aRollDie, *aCreateToken, *aCreateAnotherToken,
*aCardMenu; *aCardMenu;
CardItem *activeCard;
QList<QAction *> aAddCounter, aSetCounter, aRemoveCounter; QList<QAction *> aAddCounter, aSetCounter, aRemoveCounter;
QAction *aPlay, QAction *aPlay,
@@ -250,6 +250,7 @@ public:
~Player(); ~Player();
void retranslateUi(); void retranslateUi();
void clear(); void clear();
TabGame *getGame() const { return game; }
QMenu *getPlayerMenu() const { return playerMenu; } QMenu *getPlayerMenu() const { return playerMenu; }
int getId() const { return id; } int getId() const { return id; }
QString getName() const; QString getName() const;
@@ -260,7 +261,6 @@ public:
const QMap<int, ArrowItem *> &getArrows() const { return arrows; } const QMap<int, ArrowItem *> &getArrows() const { return arrows; }
void setCardMenu(QMenu *menu); void setCardMenu(QMenu *menu);
QMenu *getCardMenu() const; QMenu *getCardMenu() const;
void setActiveCard(CardItem *card) { activeCard = card; }
void updateCardMenu(CardItem *card, QMenu *cardMenu, QMenu *ptMenu, QMenu *moveMenu); void updateCardMenu(CardItem *card, QMenu *cardMenu, QMenu *ptMenu, QMenu *moveMenu);
bool getActive() const { return active; } bool getActive() const { return active; }
void setActive(bool _active); void setActive(bool _active);

View File

@@ -60,6 +60,7 @@ void StackZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone
return; return;
Command_MoveCard cmd; Command_MoveCard cmd;
cmd.set_start_player_id(startZone->getPlayer()->getId());
cmd.set_start_zone(startZone->getName().toStdString()); cmd.set_start_zone(startZone->getName().toStdString());
cmd.set_target_player_id(player->getId()); cmd.set_target_player_id(player->getId());
cmd.set_target_zone(getName().toStdString()); cmd.set_target_zone(getName().toStdString());

View File

@@ -210,6 +210,7 @@ TabGame::TabGame(GameReplay *_replay)
started(false), started(false),
resuming(false), resuming(false),
currentPhase(-1), currentPhase(-1),
activeCard(0),
replay(_replay), replay(_replay),
currentReplayStep(0) currentReplayStep(0)
{ {
@@ -355,6 +356,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, QList<AbstractClient *> &_client
started(false), started(false),
resuming(event.resuming()), resuming(event.resuming()),
currentPhase(-1), currentPhase(-1),
activeCard(0),
replay(0) replay(0)
{ {
gameTimer = new QTimer(this); 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(hovered(AbstractCardItem *)), cardInfo, SLOT(setCard(AbstractCardItem *)));
connect(card, SIGNAL(showCardInfoPopup(QPoint, QString)), this, SLOT(showCardInfoPopup(QPoint, QString))); connect(card, SIGNAL(showCardInfoPopup(QPoint, QString)), this, SLOT(showCardInfoPopup(QPoint, QString)));
connect(card, SIGNAL(deleteCardInfoPopup(QString)), this, SLOT(deleteCardInfoPopup(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 CardItem *TabGame::getCard(int playerId, const QString &zoneName, int cardId) const
@@ -1102,3 +1105,16 @@ Player *TabGame::getActiveLocalPlayer() const
return 0; return 0;
} }
#include <QDebug>
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<CardItem *>(card), cardMenu, ptMenu, moveMenu);
}

View File

@@ -110,6 +110,7 @@ private:
QStringList phasesList; QStringList phasesList;
int currentPhase; int currentPhase;
int activePlayer; int activePlayer;
CardItem *activeCard;
// Replay related members // Replay related members
GameReplay *replay; GameReplay *replay;
@@ -177,6 +178,7 @@ private slots:
void incrementGameTime(); void incrementGameTime();
void adminLockChanged(bool lock); void adminLockChanged(bool lock);
void newCardAdded(AbstractCardItem *card); void newCardAdded(AbstractCardItem *card);
void updateCardMenu(AbstractCardItem *card, QMenu *cardMenu, QMenu *ptMenu, QMenu *moveMenu);
void actConcede(); void actConcede();
void actLeaveGame(); void actLeaveGame();
@@ -201,6 +203,9 @@ public:
bool getSpectatorsSeeEverything() const { return spectatorsSeeEverything; } bool getSpectatorsSeeEverything() const { return spectatorsSeeEverything; }
Player *getActiveLocalPlayer() const; Player *getActiveLocalPlayer() const;
AbstractClient *getClientForPlayer(int playerId) const; AbstractClient *getClientForPlayer(int playerId) const;
void setActiveCard(CardItem *_card) { activeCard = _card; }
CardItem *getActiveCard() const { return activeCard; }
void processGameEventContainer(const GameEventContainer &cont, AbstractClient *client); void processGameEventContainer(const GameEventContainer &cont, AbstractClient *client);
PendingCommand *prepareGameCommand(const ::google::protobuf::Message &cmd); PendingCommand *prepareGameCommand(const ::google::protobuf::Message &cmd);

View File

@@ -97,6 +97,7 @@ void TableZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone
void TableZone::handleDropEventByGrid(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &gridPoint) void TableZone::handleDropEventByGrid(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &gridPoint)
{ {
Command_MoveCard cmd; Command_MoveCard cmd;
cmd.set_start_player_id(startZone->getPlayer()->getId());
cmd.set_start_zone(startZone->getName().toStdString()); cmd.set_start_zone(startZone->getName().toStdString());
cmd.set_target_player_id(player->getId()); cmd.set_target_player_id(player->getId());
cmd.set_target_zone(getName().toStdString()); cmd.set_target_zone(getName().toStdString());

View File

@@ -55,7 +55,7 @@ void TitleLabel::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
emit mouseMoved(event->scenePos() - buttonDownPos); emit mouseMoved(event->scenePos() - buttonDownPos);
} }
ZoneViewWidget::ZoneViewWidget(Player *_player, CardZone *_origZone, int numberCards, bool _revealZone, const QList<const ServerInfo_Card *> &cardList) ZoneViewWidget::ZoneViewWidget(Player *_player, CardZone *_origZone, int numberCards, bool _revealZone, bool _writeableRevealZone, const QList<const ServerInfo_Card *> &cardList)
: QGraphicsWidget(0, Qt::Tool | Qt::FramelessWindowHint), player(_player) : QGraphicsWidget(0, Qt::Tool | Qt::FramelessWindowHint), player(_player)
{ {
setAcceptHoverEvents(true); setAcceptHoverEvents(true);
@@ -105,7 +105,7 @@ ZoneViewWidget::ZoneViewWidget(Player *_player, CardZone *_origZone, int numberC
extraHeight = vbox->sizeHint(Qt::PreferredSize).height(); extraHeight = vbox->sizeHint(Qt::PreferredSize).height();
resize(150, 150); resize(150, 150);
zone = new ZoneViewZone(player, _origZone, numberCards, _revealZone, this); zone = new ZoneViewZone(player, _origZone, numberCards, _revealZone, _writeableRevealZone, this);
vbox->addItem(zone); vbox->addItem(zone);
if (sortByNameCheckBox) { if (sortByNameCheckBox) {

View File

@@ -51,7 +51,7 @@ private slots:
void zoneDeleted(); void zoneDeleted();
void moveWidget(QPointF scenePos); void moveWidget(QPointF scenePos);
public: public:
ZoneViewWidget(Player *_player, CardZone *_origZone, int numberCards = 0, bool _revealZone = false, const QList<const ServerInfo_Card *> &cardList = QList<const ServerInfo_Card *>()); ZoneViewWidget(Player *_player, CardZone *_origZone, int numberCards = 0, bool _revealZone = false, bool _writeableRevealZone = false, const QList<const ServerInfo_Card *> &cardList = QList<const ServerInfo_Card *>());
ZoneViewZone *getZone() const { return zone; } ZoneViewZone *getZone() const { return zone; }
void retranslateUi(); void retranslateUi();
protected: protected:

View File

@@ -10,10 +10,11 @@
#include "pb/response_dump_zone.pb.h" #include "pb/response_dump_zone.pb.h"
#include "pending_command.h" #include "pending_command.h"
ZoneViewZone::ZoneViewZone(Player *_p, CardZone *_origZone, int _numberCards, bool _revealZone, QGraphicsItem *parent) 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), sortByName(false), sortByType(false) : 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); origZone->setView(this);
} }
@@ -21,7 +22,7 @@ ZoneViewZone::~ZoneViewZone()
{ {
emit beingDeleted(); emit beingDeleted();
qDebug("ZoneViewZone destructor"); qDebug("ZoneViewZone destructor");
if (!revealZone) if (!(revealZone && !writeableRevealZone))
origZone->setView(NULL); origZone->setView(NULL);
} }
@@ -135,6 +136,7 @@ void ZoneViewZone::addCardImpl(CardItem *card, int x, int /*y*/)
void ZoneViewZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &/*dropPoint*/) void ZoneViewZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &/*dropPoint*/)
{ {
Command_MoveCard cmd; Command_MoveCard cmd;
cmd.set_start_player_id(startZone->getPlayer()->getId());
cmd.set_start_zone(startZone->getName().toStdString()); cmd.set_start_zone(startZone->getName().toStdString());
cmd.set_target_player_id(player->getId()); cmd.set_target_player_id(player->getId());
cmd.set_target_zone(getName().toStdString()); cmd.set_target_zone(getName().toStdString());
@@ -168,3 +170,14 @@ QSizeF ZoneViewZone::sizeHint(Qt::SizeHint /*which*/, const QSizeF & /*constrain
{ {
return optimumRect.size(); return optimumRect.size();
} }
void ZoneViewZone::setWriteableRevealZone(bool _writeableRevealZone)
{
if (writeableRevealZone && !_writeableRevealZone)
origZone->setView(this);
else if (!writeableRevealZone && _writeableRevealZone)
origZone->setView(NULL);
writeableRevealZone = _writeableRevealZone;
}

View File

@@ -15,10 +15,10 @@ private:
int minRows, numberCards; int minRows, numberCards;
void handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &dropPoint); void handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &dropPoint);
CardZone *origZone; CardZone *origZone;
bool revealZone; bool revealZone, writeableRevealZone;
bool sortByName, sortByType; bool sortByName, sortByType;
public: 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(); ~ZoneViewZone();
QRectF boundingRect() const; QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
@@ -28,6 +28,9 @@ public:
int getNumberCards() const { return numberCards; } int getNumberCards() const { return numberCards; }
void setGeometry(const QRectF &rect); void setGeometry(const QRectF &rect);
QRectF getOptimumRect() const { return optimumRect; } QRectF getOptimumRect() const { return optimumRect; }
bool getRevealZone() const { return revealZone; }
bool getWriteableRevealZone() const { return writeableRevealZone; }
void setWriteableRevealZone(bool _writeableRevealZone);
public slots: public slots:
void setSortByName(int _sortByName); void setSortByName(int _sortByName);
void setSortByType(int _sortByType); void setSortByType(int _sortByType);

View File

@@ -14,11 +14,12 @@ message Command_MoveCard {
extend GameCommand { extend GameCommand {
optional Command_MoveCard ext = 1027; optional Command_MoveCard ext = 1027;
} }
optional string start_zone = 1; optional sint32 start_player_id = 1 [default = -1];
optional ListOfCardsToMove cards_to_move = 2; optional string start_zone = 2;
optional sint32 target_player_id = 3 [default = -1]; optional ListOfCardsToMove cards_to_move = 3;
optional string target_zone = 4; optional sint32 target_player_id = 4 [default = -1];
optional sint32 x = 5 [default = -1]; optional string target_zone = 5;
optional sint32 y = 6 [default = -1]; optional sint32 x = 6 [default = -1];
optional sint32 y = 7 [default = -1];
} }

View File

@@ -6,4 +6,5 @@ message Command_RevealCards {
optional string zone_name = 1; optional string zone_name = 1;
optional sint32 card_id = 2 [default = -1]; optional sint32 card_id = 2 [default = -1];
optional sint32 player_id = 3 [default = -1]; optional sint32 player_id = 3 [default = -1];
optional bool grant_write_access = 4;
} }

View File

@@ -6,12 +6,13 @@ message Event_MoveCard {
} }
optional sint32 card_id = 1 [default = -1]; optional sint32 card_id = 1 [default = -1];
optional string card_name = 2; optional string card_name = 2;
optional string start_zone = 3; optional sint32 start_player_id = 3 [default = -1];
optional sint32 position = 4 [default = -1]; optional string start_zone = 4;
optional sint32 target_player_id = 5 [default = -1]; optional sint32 position = 5 [default = -1];
optional string target_zone = 6; optional sint32 target_player_id = 6 [default = -1];
optional sint32 x = 7 [default = -1]; optional string target_zone = 7;
optional sint32 y = 8 [default = -1]; optional sint32 x = 8 [default = -1];
optional sint32 new_card_id = 9 [default = -1]; optional sint32 y = 9 [default = -1];
optional bool face_down = 10; optional sint32 new_card_id = 10 [default = -1];
optional bool face_down = 11;
} }

View File

@@ -9,4 +9,5 @@ message Event_RevealCards {
optional sint32 card_id = 2 [default = -1]; optional sint32 card_id = 2 [default = -1];
optional sint32 other_player_id = 3 [default = -1]; optional sint32 other_player_id = 3 [default = -1];
repeated ServerInfo_Card cards = 4; repeated ServerInfo_Card cards = 4;
optional bool grant_write_access = 5;
} }

View File

@@ -43,6 +43,8 @@ void Server_CardZone::shuffle()
for (int i = cards.size(); i; i--) for (int i = cards.size(); i; i--)
temp.append(cards.takeAt(rng->getNumber(0, i - 1))); temp.append(cards.takeAt(rng->getNumber(0, i - 1)));
cards = temp; cards = temp;
playersWithWritePermission.clear();
} }
int Server_CardZone::removeCard(Server_Card *card) int Server_CardZone::removeCard(Server_Card *card)
@@ -206,4 +208,10 @@ void Server_CardZone::clear()
for (int i = 0; i < cards.size(); i++) for (int i = 0; i < cards.size(); i++)
delete cards.at(i); delete cards.at(i);
cards.clear(); cards.clear();
playersWithWritePermission.clear();
}
void Server_CardZone::addWritePermission(int playerId)
{
playersWithWritePermission.insert(playerId);
} }

View File

@@ -23,6 +23,7 @@
#include <QList> #include <QList>
#include <QString> #include <QString>
#include <QMap> #include <QMap>
#include <QSet>
#include "pb/serverinfo_zone.pb.h" #include "pb/serverinfo_zone.pb.h"
class Server_Card; class Server_Card;
@@ -37,6 +38,7 @@ private:
bool has_coords; bool has_coords;
ServerInfo_Zone::ZoneType type; ServerInfo_Zone::ZoneType type;
int cardsBeingLookedAt; int cardsBeingLookedAt;
QSet<int> playersWithWritePermission;
public: public:
Server_CardZone(Server_Player *_player, const QString &_name, bool _has_coords, ServerInfo_Zone::ZoneType _type); Server_CardZone(Server_Player *_player, const QString &_name, bool _has_coords, ServerInfo_Zone::ZoneType _type);
~Server_CardZone(); ~Server_CardZone();
@@ -60,6 +62,8 @@ public:
void insertCard(Server_Card *card, int x, int y); void insertCard(Server_Card *card, int x, int y);
void shuffle(); void shuffle();
void clear(); void clear();
void addWritePermission(int playerId);
const QSet<int> &getPlayersWithWritePermission() const { return playersWithWritePermission; }
}; };
#endif #endif

View File

@@ -342,21 +342,6 @@ Response::ResponseCode Server_Player::undoDraw(GameEventStorage &ges)
return retVal; return retVal;
} }
Response::ResponseCode Server_Player::moveCard(GameEventStorage &ges, const QString &_startZone, const QList<const CardToMove *> &_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 { class Server_Player::MoveCardCompareFunctor {
private: private:
int x; int x;
@@ -510,6 +495,7 @@ Response::ResponseCode Server_Player::moveCard(GameEventStorage &ges, Server_Car
privatePosition = position; privatePosition = position;
Event_MoveCard eventOthers; Event_MoveCard eventOthers;
eventOthers.set_start_player_id(startzone->getPlayer()->getPlayerId());
eventOthers.set_start_zone(startzone->getName().toStdString()); eventOthers.set_start_zone(startzone->getName().toStdString());
eventOthers.set_target_player_id(targetzone->getPlayer()->getPlayerId()); eventOthers.set_target_player_id(targetzone->getPlayer()->getPlayerId());
if (startzone != targetzone) if (startzone != targetzone)
@@ -858,11 +844,31 @@ Response::ResponseCode Server_Player::cmdMoveCard(const Command_MoveCard &cmd, R
if (conceded) if (conceded)
return Response::RespContextError; 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<const CardToMove *> cardsToMove; QList<const CardToMove *> cardsToMove;
for (int i = 0; i < cmd.cards_to_move().card_size(); ++i) for (int i = 0; i < cmd.cards_to_move().card_size(); ++i)
cardsToMove.append(&cmd.cards_to_move().card(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) 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; Event_RevealCards eventOthers;
eventOthers.set_grant_write_access(cmd.grant_write_access());
eventOthers.set_zone_name(zone->getName().toStdString()); eventOthers.set_zone_name(zone->getName().toStdString());
if (cmd.has_card_id()) if (cmd.has_card_id())
eventOthers.set_card_id(cmd.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.has_player_id()) {
if (cmd.grant_write_access())
zone->addWritePermission(cmd.player_id());
ges.enqueueGameEvent(eventPrivate, playerId, GameEventStorageItem::SendToPrivate, cmd.player_id()); ges.enqueueGameEvent(eventPrivate, playerId, GameEventStorageItem::SendToPrivate, cmd.player_id());
ges.enqueueGameEvent(eventOthers, playerId, GameEventStorageItem::SendToOthers); ges.enqueueGameEvent(eventOthers, playerId, GameEventStorageItem::SendToOthers);
} else } else {
if (cmd.grant_write_access()) {
const QList<int> &playerIds = game->getPlayers().keys();
for (int i = 0; i < playerIds.size(); ++i)
zone->addWritePermission(playerIds[i]);
}
ges.enqueueGameEvent(eventPrivate, playerId); ges.enqueueGameEvent(eventPrivate, playerId);
}
return Response::RespOk; return Response::RespOk;
} }

View File

@@ -117,7 +117,6 @@ public:
Response::ResponseCode drawCards(GameEventStorage &ges, int number); Response::ResponseCode drawCards(GameEventStorage &ges, int number);
Response::ResponseCode undoDraw(GameEventStorage &ges); Response::ResponseCode undoDraw(GameEventStorage &ges);
Response::ResponseCode moveCard(GameEventStorage &ges, const QString &_startZone, const QList<const CardToMove *> &_cards, int _targetPlayer, const QString &_targetZone, int _x, int _y);
Response::ResponseCode moveCard(GameEventStorage &ges, Server_CardZone *startzone, const QList<const CardToMove *> &_cards, Server_CardZone *targetzone, int x, int y, bool fixFreeSpaces = true, bool undoingDraw = false); Response::ResponseCode moveCard(GameEventStorage &ges, Server_CardZone *startzone, const QList<const CardToMove *> &_cards, Server_CardZone *targetzone, int x, int y, bool fixFreeSpaces = true, bool undoingDraw = false);
void unattachCard(GameEventStorage &ges, Server_Card *card); void unattachCard(GameEventStorage &ges, Server_Card *card);
Response::ResponseCode setCardAttrHelper(GameEventStorage &ges, const QString &zone, int cardId, CardAttribute attribute, const QString &attrValue); Response::ResponseCode setCardAttrHelper(GameEventStorage &ges, const QString &zone, int cardId, CardAttribute attribute, const QString &attrValue);

View File

@@ -194,8 +194,6 @@ Response::ResponseCode Server_ProtocolHandler::processGameCommandContainer(const
if (authState == NotLoggedIn) if (authState == NotLoggedIn)
return Response::RespLoginNeeded; return Response::RespLoginNeeded;
qDebug() << QString::fromStdString(cont.DebugString());
QMap<int, QPair<int, int> > gameMap = getGames(); QMap<int, QPair<int, int> > gameMap = getGames();
if (!gameMap.contains(cont.game_id())) if (!gameMap.contains(cont.game_id()))
return Response::RespNotInRoom; return Response::RespNotInRoom;