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 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; }

View File

@@ -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<const ZoneViewZone *const>(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<ZoneViewZone *>(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);

View File

@@ -74,7 +74,6 @@ public:
const QList<CardItem *> &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);

View File

@@ -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);

View File

@@ -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<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();
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

View File

@@ -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<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);
connect(item, SIGNAL(closePressed(ZoneViewWidget *)), this, SLOT(removeZoneView(ZoneViewWidget *)));
addItem(item);

View File

@@ -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<const ServerInfo_Card *> &cardList);
void addRevealedZoneView(Player *player, CardZone *zone, const QList<const ServerInfo_Card *> &cardList, bool withWritePermission);
void removeZoneView(ZoneViewWidget *item);
void addPlayer(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*/)
{
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());

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))));
}
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;
QString fromStr;
@@ -188,18 +188,36 @@ QPair<QString, QString> 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<QString, QString> 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<QString, QString> temp = getFromStr(attributes.startZone, cardName, attributes.oldX);
QPair<QString, QString> temp = getFromStr(attributes.startZone, cardName, attributes.oldX, ownerChange);
bool cardNameContainsStartZone = false;
if (!temp.first.isEmpty()) {
cardNameContainsStartZone = true;
@@ -232,7 +251,7 @@ void MessageLogWidget::doMoveCard(LogMoveCard &attributes)
else
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));
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<QString, QString> temp = getFromStr(zone, cardName, cardId);
QPair<QString, QString> temp = getFromStr(zone, cardName, cardId, false);
bool cardNameContainsStartZone = false;
if (!temp.first.isEmpty()) {
cardNameContainsStartZone = true;

View File

@@ -28,7 +28,7 @@ private:
QString sanitizeHtml(QString dirty) 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;
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*/)
{
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());

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)
: 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<Player *> &players = _parent->getPlayers().values();
const QList<Player *> &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<TabGame *>(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<TabGame *>(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<TabGame *>(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<int, Player *> playerIterator(static_cast<TabGame *>(parent())->getPlayers());
QMapIterator<int, Player *> 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<int, Player *> &playerList = static_cast<TabGame *>(parent())->getPlayers();
const QMap<int, Player *> &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<TabGame *>(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<GameScene *>(scene())->addRevealedZoneView(this, zone, cardList);
static_cast<GameScene *>(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<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)
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<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 *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<TabGame *>(parent())->prepareGameCommand(cmd);
return game->prepareGameCommand(cmd);
}
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)
{
static_cast<TabGame *>(parent())->sendGameCommand(command, id);
game->sendGameCommand(command, id);
}
void Player::sendGameCommand(PendingCommand *pend)
{
static_cast<TabGame *>(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<TabGame *>(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<ZoneViewZone *>(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);

View File

@@ -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<QMenu *> playerLists;
@@ -160,7 +161,6 @@ private:
*aDrawCard, *aDrawCards, *aUndoDraw, *aMulligan, *aShuffle,
*aUntapAll, *aRollDie, *aCreateToken, *aCreateAnotherToken,
*aCardMenu;
CardItem *activeCard;
QList<QAction *> 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<int, ArrowItem *> &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);

View File

@@ -60,6 +60,7 @@ void StackZone::handleDropEvent(const QList<CardDragItem *> &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());

View File

@@ -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<AbstractClient *> &_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 <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;
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();
@@ -202,6 +204,9 @@ public:
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);
PendingCommand *prepareGameCommand(const QList< const ::google::protobuf::Message * > &cmdList);

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)
{
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());

View File

@@ -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<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)
{
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) {

View File

@@ -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<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; }
void retranslateUi();
protected:

View File

@@ -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<CardDragItem *> &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;
}

View File

@@ -15,10 +15,10 @@ private:
int minRows, numberCards;
void handleDropEvent(const QList<CardDragItem *> &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);

View File

@@ -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];
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -23,6 +23,7 @@
#include <QList>
#include <QString>
#include <QMap>
#include <QSet>
#include "pb/serverinfo_zone.pb.h"
class Server_Card;
@@ -37,6 +38,7 @@ private:
bool has_coords;
ServerInfo_Zone::ZoneType type;
int cardsBeingLookedAt;
QSet<int> 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<int> &getPlayersWithWritePermission() const { return playersWithWritePermission; }
};
#endif

View File

@@ -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<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 {
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<const CardToMove *> 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<int> &playerIds = game->getPlayers().keys();
for (int i = 0; i < playerIds.size(); ++i)
zone->addWritePermission(playerIds[i]);
}
ges.enqueueGameEvent(eventPrivate, playerId);
}
return Response::RespOk;
}

View File

@@ -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<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);
void unattachCard(GameEventStorage &ges, Server_Card *card);
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)
return Response::RespLoginNeeded;
qDebug() << QString::fromStdString(cont.DebugString());
QMap<int, QPair<int, int> > gameMap = getGames();
if (!gameMap.contains(cont.game_id()))
return Response::RespNotInRoom;