added peeking at facedown cards, fixing issue #7

This commit is contained in:
Max-Wilhelm Bruker 2012-03-24 18:52:08 +01:00
parent 662df6d972
commit 5ff1fd8ec6
12 changed files with 134 additions and 76 deletions

View file

@ -11,8 +11,8 @@
#include "gamescene.h" #include "gamescene.h"
#include <QDebug> #include <QDebug>
AbstractCardItem::AbstractCardItem(const QString &_name, Player *_owner, QGraphicsItem *parent) AbstractCardItem::AbstractCardItem(const QString &_name, Player *_owner, int _id, QGraphicsItem *parent)
: ArrowTarget(_owner, parent), infoWidget(0), name(_name), tapped(false), tapAngle(0), isHovered(false), realZValue(0) : ArrowTarget(_owner, parent), infoWidget(0), id(_id), name(_name), tapped(false), facedown(false), tapAngle(0), isHovered(false), realZValue(0)
{ {
setCursor(Qt::OpenHandCursor); setCursor(Qt::OpenHandCursor);
setFlag(ItemIsSelectable); setFlag(ItemIsSelectable);
@ -85,8 +85,9 @@ void AbstractCardItem::transformPainter(QPainter *painter, const QSizeF &transla
void AbstractCardItem::paintPicture(QPainter *painter, const QSizeF &translatedSize, int angle) void AbstractCardItem::paintPicture(QPainter *painter, const QSizeF &translatedSize, int angle)
{ {
qreal scaleFactor = translatedSize.width() / boundingRect().width(); qreal scaleFactor = translatedSize.width() / boundingRect().width();
QPixmap *translatedPixmap = info->getPixmap(translatedSize.toSize()); CardInfo *imageSource = facedown ? db->getCard() : info;
QPixmap *translatedPixmap = imageSource->getPixmap(translatedSize.toSize());
painter->save(); painter->save();
QColor bgColor = Qt::transparent; QColor bgColor = Qt::transparent;
if (translatedPixmap) { if (translatedPixmap) {
@ -124,13 +125,18 @@ void AbstractCardItem::paintPicture(QPainter *painter, const QSizeF &translatedS
painter->setPen(pen); painter->setPen(pen);
painter->drawRect(QRectF(1, 1, CARD_WIDTH - 2, CARD_HEIGHT - 2)); painter->drawRect(QRectF(1, 1, CARD_WIDTH - 2, CARD_HEIGHT - 2));
if (!translatedPixmap || settingsCache->getDisplayCardNames()) { if (!translatedPixmap || settingsCache->getDisplayCardNames() || facedown) {
painter->save(); painter->save();
transformPainter(painter, translatedSize, angle); transformPainter(painter, translatedSize, angle);
painter->setPen(Qt::white); painter->setPen(Qt::white);
painter->setBackground(Qt::black); painter->setBackground(Qt::black);
painter->setBackgroundMode(Qt::OpaqueMode); painter->setBackgroundMode(Qt::OpaqueMode);
painter->drawText(QRectF(3 * scaleFactor, 3 * scaleFactor, translatedSize.width() - 6 * scaleFactor, translatedSize.height() - 6 * scaleFactor), Qt::AlignTop | Qt::AlignLeft | Qt::TextWrapAnywhere, name); QString nameStr;
if (facedown)
nameStr = "# " + QString::number(id);
else
nameStr = name;
painter->drawText(QRectF(3 * scaleFactor, 3 * scaleFactor, translatedSize.width() - 6 * scaleFactor, translatedSize.height() - 6 * scaleFactor), Qt::AlignTop | Qt::AlignLeft | Qt::TextWrapAnywhere, nameStr);
painter->restore(); painter->restore();
} }
@ -205,6 +211,13 @@ void AbstractCardItem::setTapped(bool _tapped, bool canAnimate)
} }
} }
void AbstractCardItem::setFaceDown(bool _facedown)
{
facedown = _facedown;
update();
emit updateCardMenu(this);
}
void AbstractCardItem::mousePressEvent(QGraphicsSceneMouseEvent *event) void AbstractCardItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{ {
if (!isSelected()) { if (!isSelected()) {

View file

@ -16,8 +16,10 @@ class AbstractCardItem : public ArrowTarget {
protected: protected:
CardInfo *info; CardInfo *info;
CardInfoWidget *infoWidget; CardInfoWidget *infoWidget;
int id;
QString name; QString name;
bool tapped; bool tapped;
bool facedown;
int tapAngle; int tapAngle;
QString color; QString color;
private: private:
@ -31,17 +33,19 @@ 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); void updateCardMenu(AbstractCardItem *card);
public: public:
enum { Type = typeCard }; enum { Type = typeCard };
int type() const { return Type; } int type() const { return Type; }
AbstractCardItem(const QString &_name = QString(), Player *_owner = 0, QGraphicsItem *parent = 0); AbstractCardItem(const QString &_name = QString(), Player *_owner = 0, int _id = -1, QGraphicsItem *parent = 0);
~AbstractCardItem(); ~AbstractCardItem();
QRectF boundingRect() const; QRectF boundingRect() const;
QSizeF getTranslatedSize(QPainter *painter) const; QSizeF getTranslatedSize(QPainter *painter) const;
void paintPicture(QPainter *painter, const QSizeF &translatedSize, int angle); void paintPicture(QPainter *painter, const QSizeF &translatedSize, int angle);
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
CardInfo *getInfo() const { return info; } CardInfo *getInfo() const { return info; }
int getId() const { return id; }
void setId(int _id) { id = _id; }
QString getName() const { return name; } QString getName() const { return name; }
void setName(const QString &_name = QString()); void setName(const QString &_name = QString());
qreal getRealZValue() const { return realZValue; } qreal getRealZValue() const { return realZValue; }
@ -51,6 +55,8 @@ public:
void setColor(const QString &_color); void setColor(const QString &_color);
bool getTapped() const { return tapped; } bool getTapped() const { return tapped; }
void setTapped(bool _tapped, bool canAnimate = false); void setTapped(bool _tapped, bool canAnimate = false);
bool getFaceDown() const { return facedown; }
void setFaceDown(bool _facedown);
void processHoverEvent(); void processHoverEvent();
void deleteCardInfoPopup() { emit deleteCardInfoPopup(name); } void deleteCardInfoPopup() { emit deleteCardInfoPopup(name); }
protected: protected:

View file

@ -18,7 +18,7 @@
#include "pb/serverinfo_card.pb.h" #include "pb/serverinfo_card.pb.h"
CardItem::CardItem(Player *_owner, const QString &_name, int _cardid, bool _revealedCard, QGraphicsItem *parent) CardItem::CardItem(Player *_owner, const QString &_name, int _cardid, bool _revealedCard, QGraphicsItem *parent)
: AbstractCardItem(_name, _owner, parent), zone(0), id(_cardid), revealedCard(_revealedCard), attacking(false), facedown(false), destroyOnZoneChange(false), doesntUntap(false), dragItem(0), attachedTo(0) : AbstractCardItem(_name, _owner, _cardid, parent), zone(0), revealedCard(_revealedCard), attacking(false), destroyOnZoneChange(false), doesntUntap(false), dragItem(0), attachedTo(0)
{ {
owner->addCard(this); owner->addCard(this);
@ -27,7 +27,7 @@ CardItem::CardItem(Player *_owner, const QString &_name, int _cardid, bool _reve
moveMenu = new QMenu; moveMenu = new QMenu;
retranslateUi(); retranslateUi();
emit updateCardMenu(this, cardMenu, ptMenu, moveMenu); emit updateCardMenu(this);
} }
CardItem::~CardItem() CardItem::~CardItem()
@ -74,7 +74,7 @@ void CardItem::deleteLater()
void CardItem::setZone(CardZone *_zone) void CardItem::setZone(CardZone *_zone)
{ {
zone = _zone; zone = _zone;
emit updateCardMenu(this, cardMenu, ptMenu, moveMenu); emit updateCardMenu(this);
} }
void CardItem::retranslateUi() void CardItem::retranslateUi()
@ -135,14 +135,6 @@ void CardItem::setAttacking(bool _attacking)
update(); update();
} }
void CardItem::setFaceDown(bool _facedown)
{
facedown = _facedown;
if (facedown)
setName(QString());
update();
}
void CardItem::setCounter(int _id, int _value) void CardItem::setCounter(int _id, int _value)
{ {
if (_value) if (_value)
@ -187,7 +179,7 @@ void CardItem::setAttachedTo(CardItem *_attachedTo)
if (zone) if (zone)
zone->reorganizeCards(); zone->reorganizeCards();
emit updateCardMenu(this, cardMenu, ptMenu, moveMenu); emit updateCardMenu(this);
} }
void CardItem::resetState() void CardItem::resetState()

View file

@ -17,10 +17,8 @@ class CardItem : public AbstractCardItem {
Q_OBJECT Q_OBJECT
private: private:
CardZone *zone; CardZone *zone;
int id;
bool revealedCard; bool revealedCard;
bool attacking; bool attacking;
bool facedown;
QMap<int, int> counters; QMap<int, int> counters;
QString annotation; QString annotation;
QString pt; QString pt;
@ -50,13 +48,9 @@ public:
QPoint getGridPos() const { return gridPoint; } QPoint getGridPos() const { return gridPoint; }
Player *getOwner() const { return owner; } Player *getOwner() const { return owner; }
void setOwner(Player *_owner) { owner = _owner; } void setOwner(Player *_owner) { owner = _owner; }
int getId() const { return id; }
void setId(int _id) { id = _id; }
bool getRevealedCard() const { return revealedCard; } bool getRevealedCard() const { return revealedCard; }
bool getAttacking() const { return attacking; } bool getAttacking() const { return attacking; }
void setAttacking(bool _attacking); void setAttacking(bool _attacking);
bool getFaceDown() const { return facedown; }
void setFaceDown(bool _facedown);
const QMap<int, int> &getCounters() const { return counters; } const QMap<int, int> &getCounters() const { return counters; }
void setCounter(int _id, int _value); void setCounter(int _id, int _value);
QString getAnnotation() const { return annotation; } QString getAnnotation() const { return annotation; }
@ -75,6 +69,10 @@ public:
void resetState(); void resetState();
void processCardInfo(const ServerInfo_Card &info); void processCardInfo(const ServerInfo_Card &info);
QMenu *getCardMenu() const { return cardMenu; }
QMenu *getPTMenu() const { return ptMenu; }
QMenu *getMoveMenu() const { return moveMenu; }
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);
void deleteDragItem(); void deleteDragItem();

View file

@ -62,7 +62,7 @@ void DeckViewCardDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
} }
DeckViewCard::DeckViewCard(const QString &_name, const QString &_originZone, QGraphicsItem *parent) DeckViewCard::DeckViewCard(const QString &_name, const QString &_originZone, QGraphicsItem *parent)
: AbstractCardItem(_name, 0, parent), originZone(_originZone), dragItem(0) : AbstractCardItem(_name, 0, -1, parent), originZone(_originZone), dragItem(0)
{ {
setAcceptsHoverEvents(true); setAcceptsHoverEvents(true);
} }

View file

@ -644,7 +644,7 @@ void MessageLogWidget::logStopDumpZone(Player *player, CardZone *zone)
appendHtml(tr("%1 stops looking at %2.", "male").arg(sanitizeHtml(player->getName())).arg(zoneName)); appendHtml(tr("%1 stops looking at %2.", "male").arg(sanitizeHtml(player->getName())).arg(zoneName));
} }
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, bool faceDown)
{ {
QPair<QString, QString> temp = getFromStr(zone, cardName, cardId, false); QPair<QString, QString> temp = getFromStr(zone, cardName, cardId, false);
bool cardNameContainsStartZone = false; bool cardNameContainsStartZone = false;
@ -704,7 +704,21 @@ void MessageLogWidget::logRevealCards(Player *player, CardZone *zone, int cardId
appendHtml(tr("%1 randomly reveals %2%3.", "male").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr)); appendHtml(tr("%1 randomly reveals %2%3.", "male").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr));
} }
} else { } else {
if (otherPlayer) { if (faceDown && (player == otherPlayer)) {
if (cardName.isEmpty()) {
if (isFemale(player))
str = tr("%1 peeks at face down card #%2.", "female");
else
str = tr("%1 peeks at face down card #%2.", "male");
appendHtml(str.arg(sanitizeHtml(player->getName())).arg(cardId));
} else {
if (isFemale(player))
str = tr("%1 peeks at face down card #%2: %3.", "female");
else
str = tr("%1 peeks at face down card #%2: %3.", "male");
appendHtml(str.arg(sanitizeHtml(player->getName())).arg(cardId).arg(cardStr));
}
} else if (otherPlayer) {
if (isFemale(player)) { if (isFemale(player)) {
if (isFemale(otherPlayer)) if (isFemale(otherPlayer))
str = tr("%1 reveals %2%3 to %4.", "p1 female, p2 female"); str = tr("%1 reveals %2%3 to %4.", "p1 female, p2 female");
@ -809,7 +823,7 @@ void MessageLogWidget::connectToPlayer(Player *player)
connect(player, SIGNAL(logStopDumpZone(Player *, CardZone *)), this, SLOT(logStopDumpZone(Player *, CardZone *))); connect(player, SIGNAL(logStopDumpZone(Player *, CardZone *)), this, SLOT(logStopDumpZone(Player *, CardZone *)));
connect(player, SIGNAL(logDrawCards(Player *, int)), this, SLOT(logDrawCards(Player *, int))); connect(player, SIGNAL(logDrawCards(Player *, int)), this, SLOT(logDrawCards(Player *, int)));
connect(player, SIGNAL(logUndoDraw(Player *, QString)), this, SLOT(logUndoDraw(Player *, QString))); connect(player, SIGNAL(logUndoDraw(Player *, QString)), this, SLOT(logUndoDraw(Player *, QString)));
connect(player, SIGNAL(logRevealCards(Player *, CardZone *, int, QString, Player *)), this, SLOT(logRevealCards(Player *, CardZone *, int, QString, Player *))); connect(player, SIGNAL(logRevealCards(Player *, CardZone *, int, QString, Player *, bool)), this, SLOT(logRevealCards(Player *, CardZone *, int, QString, Player *, bool)));
} }
MessageLogWidget::MessageLogWidget(const QString &_ownName, bool _female, QWidget *parent) MessageLogWidget::MessageLogWidget(const QString &_ownName, bool _female, QWidget *parent)

View file

@ -75,7 +75,7 @@ public slots:
void logSetAnnotation(Player *player, CardItem *card, QString newAnnotation); void logSetAnnotation(Player *player, CardItem *card, QString newAnnotation);
void logDumpZone(Player *player, CardZone *zone, int numberCards); void logDumpZone(Player *player, CardZone *zone, int numberCards);
void logStopDumpZone(Player *player, CardZone *zone); void logStopDumpZone(Player *player, CardZone *zone);
void logRevealCards(Player *player, CardZone *zone, int cardId, QString cardName, Player *otherPlayer); void logRevealCards(Player *player, CardZone *zone, int cardId, QString cardName, Player *otherPlayer, bool faceDown);
void logSetActivePlayer(Player *player); void logSetActivePlayer(Player *player);
void logSetActivePhase(int phase); void logSetActivePhase(int phase);
void containerProcessingStarted(const GameEventContext &context); void containerProcessingStarted(const GameEventContext &context);

View file

@ -323,13 +323,13 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, TabGame *_pare
} }
aTap = new QAction(this); aTap = new QAction(this);
aTap->setData(0); aTap->setData(cmTap);
connect(aTap, SIGNAL(triggered()), this, SLOT(cardMenuAction())); connect(aTap, SIGNAL(triggered()), this, SLOT(cardMenuAction()));
aUntap = new QAction(this); aUntap = new QAction(this);
aUntap->setData(1); aUntap->setData(cmUntap);
connect(aUntap, SIGNAL(triggered()), this, SLOT(cardMenuAction())); connect(aUntap, SIGNAL(triggered()), this, SLOT(cardMenuAction()));
aDoesntUntap = new QAction(this); aDoesntUntap = new QAction(this);
aDoesntUntap->setData(2); aDoesntUntap->setData(cmDoesntUntap);
connect(aDoesntUntap, SIGNAL(triggered()), this, SLOT(cardMenuAction())); connect(aDoesntUntap, SIGNAL(triggered()), this, SLOT(cardMenuAction()));
aAttach = new QAction(this); aAttach = new QAction(this);
connect(aAttach, SIGNAL(triggered()), this, SLOT(actAttach())); connect(aAttach, SIGNAL(triggered()), this, SLOT(actAttach()));
@ -354,19 +354,22 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, TabGame *_pare
aSetAnnotation = new QAction(this); aSetAnnotation = new QAction(this);
connect(aSetAnnotation, SIGNAL(triggered()), this, SLOT(actSetAnnotation())); connect(aSetAnnotation, SIGNAL(triggered()), this, SLOT(actSetAnnotation()));
aFlip = new QAction(this); aFlip = new QAction(this);
aFlip->setData(3); aFlip->setData(cmFlip);
connect(aFlip, SIGNAL(triggered()), this, SLOT(cardMenuAction())); connect(aFlip, SIGNAL(triggered()), this, SLOT(cardMenuAction()));
aPeek = new QAction(this);
aPeek->setData(cmPeek);
connect(aPeek, SIGNAL(triggered()), this, SLOT(cardMenuAction()));
aClone = new QAction(this); aClone = new QAction(this);
aClone->setData(4); aClone->setData(cmClone);
connect(aClone, SIGNAL(triggered()), this, SLOT(cardMenuAction())); connect(aClone, SIGNAL(triggered()), this, SLOT(cardMenuAction()));
aMoveToTopLibrary = new QAction(this); aMoveToTopLibrary = new QAction(this);
aMoveToTopLibrary->setData(5); aMoveToTopLibrary->setData(cmMoveToTopLibrary);
aMoveToBottomLibrary = new QAction(this); aMoveToBottomLibrary = new QAction(this);
aMoveToBottomLibrary->setData(6); aMoveToBottomLibrary->setData(cmMoveToBottomLibrary);
aMoveToGraveyard = new QAction(this); aMoveToGraveyard = new QAction(this);
aMoveToGraveyard->setData(7); aMoveToGraveyard->setData(cmMoveToGraveyard);
aMoveToExile = new QAction(this); aMoveToExile = new QAction(this);
aMoveToExile->setData(8); aMoveToExile->setData(cmMoveToExile);
connect(aMoveToTopLibrary, SIGNAL(triggered()), this, SLOT(cardMenuAction())); connect(aMoveToTopLibrary, SIGNAL(triggered()), this, SLOT(cardMenuAction()));
connect(aMoveToBottomLibrary, SIGNAL(triggered()), this, SLOT(cardMenuAction())); connect(aMoveToBottomLibrary, SIGNAL(triggered()), this, SLOT(cardMenuAction()));
connect(aMoveToGraveyard, SIGNAL(triggered()), this, SLOT(cardMenuAction())); connect(aMoveToGraveyard, SIGNAL(triggered()), this, SLOT(cardMenuAction()));
@ -608,6 +611,7 @@ void Player::retranslateUi()
aUntap->setText(tr("&Untap")); aUntap->setText(tr("&Untap"));
aDoesntUntap->setText(tr("Toggle &normal untapping")); aDoesntUntap->setText(tr("Toggle &normal untapping"));
aFlip->setText(tr("&Flip")); aFlip->setText(tr("&Flip"));
aPeek->setText(tr("&Peek at card face"));
aClone->setText(tr("&Clone")); aClone->setText(tr("&Clone"));
aClone->setShortcut(tr("Ctrl+H")); aClone->setShortcut(tr("Ctrl+H"));
aAttach->setText(tr("&Attach to card...")); aAttach->setText(tr("&Attach to card..."));
@ -1094,7 +1098,8 @@ void Player::eventMoveCard(const Event_MoveCard &event, const GameEventContext &
return; return;
if (startZone != targetZone) if (startZone != targetZone)
card->deleteCardInfoPopup(); card->deleteCardInfoPopup();
card->setName(QString::fromStdString(event.card_name())); if (event.has_card_name())
card->setName(QString::fromStdString(event.card_name()));
if (card->getAttachedTo() && (startZone != targetZone)) { if (card->getAttachedTo() && (startZone != targetZone)) {
CardItem *parentCard = card->getAttachedTo(); CardItem *parentCard = card->getAttachedTo();
@ -1256,19 +1261,34 @@ void Player::eventRevealCards(const Event_RevealCards &event)
return; return;
} }
bool peeking = false;
QList<const ServerInfo_Card *> cardList; QList<const ServerInfo_Card *> cardList;
const int cardListSize = event.cards_size(); const int cardListSize = event.cards_size();
for (int i = 0; i < cardListSize; ++i) { for (int i = 0; i < cardListSize; ++i) {
const ServerInfo_Card *temp = &event.cards(i); const ServerInfo_Card *temp = &event.cards(i);
if (temp->face_down())
peeking = true;
cardList.append(temp); cardList.append(temp);
} }
if (!cardList.isEmpty())
static_cast<GameScene *>(scene())->addRevealedZoneView(this, zone, cardList, event.grant_write_access());
QString cardName; if (peeking) {
if (cardList.size() == 1) for (int i = 0; i < cardList.size(); ++i) {
cardName = QString::fromStdString(cardList.first()->name()); QString cardName = QString::fromStdString(cardList.at(i)->name());
emit logRevealCards(this, zone, event.card_id(), cardName, otherPlayer); CardItem *card = zone->getCard(cardList.at(i)->id(), QString());
if (!card)
continue;
card->setName(cardName);
emit logRevealCards(this, zone, cardList.at(i)->id(), cardName, this, true);
}
} else {
if (!cardList.isEmpty())
static_cast<GameScene *>(scene())->addRevealedZoneView(this, zone, cardList, event.grant_write_access());
QString cardName;
if (cardList.size() == 1)
cardName = QString::fromStdString(cardList.first()->name());
emit logRevealCards(this, zone, event.card_id(), cardName, otherPlayer, false);
}
} }
void Player::processGameEvent(GameEvent::GameEventType type, const GameEvent &event, const GameEventContext &context) void Player::processGameEvent(GameEvent::GameEventType type, const GameEvent &event, const GameEventContext &context)
@ -1602,8 +1622,8 @@ void Player::cardMenuAction()
if (a->data().toInt() <= 4) if (a->data().toInt() <= 4)
for (int i = 0; i < cardList.size(); ++i) { for (int i = 0; i < cardList.size(); ++i) {
CardItem *card = cardList[i]; CardItem *card = cardList[i];
switch (a->data().toInt()) { switch (static_cast<CardMenuActionType>(a->data().toInt())) {
case 0: case cmTap:
if (!card->getTapped()) { if (!card->getTapped()) {
Command_SetCardAttr *cmd = new Command_SetCardAttr; Command_SetCardAttr *cmd = new Command_SetCardAttr;
cmd->set_zone(card->getZone()->getName().toStdString()); cmd->set_zone(card->getZone()->getName().toStdString());
@ -1613,7 +1633,7 @@ void Player::cardMenuAction()
commandList.append(cmd); commandList.append(cmd);
} }
break; break;
case 1: case cmUntap:
if (card->getTapped()) { if (card->getTapped()) {
Command_SetCardAttr *cmd = new Command_SetCardAttr; Command_SetCardAttr *cmd = new Command_SetCardAttr;
cmd->set_zone(card->getZone()->getName().toStdString()); cmd->set_zone(card->getZone()->getName().toStdString());
@ -1623,7 +1643,7 @@ void Player::cardMenuAction()
commandList.append(cmd); commandList.append(cmd);
} }
break; break;
case 2: { case cmDoesntUntap: {
Command_SetCardAttr *cmd = new Command_SetCardAttr; Command_SetCardAttr *cmd = new Command_SetCardAttr;
cmd->set_zone(card->getZone()->getName().toStdString()); cmd->set_zone(card->getZone()->getName().toStdString());
cmd->set_card_id(card->getId()); cmd->set_card_id(card->getId());
@ -1632,7 +1652,7 @@ void Player::cardMenuAction()
commandList.append(cmd); commandList.append(cmd);
break; break;
} }
case 3: { case cmFlip: {
Command_FlipCard *cmd = new Command_FlipCard; Command_FlipCard *cmd = new Command_FlipCard;
cmd->set_zone(card->getZone()->getName().toStdString()); cmd->set_zone(card->getZone()->getName().toStdString());
cmd->set_card_id(card->getId()); cmd->set_card_id(card->getId());
@ -1640,7 +1660,15 @@ void Player::cardMenuAction()
commandList.append(cmd); commandList.append(cmd);
break; break;
} }
case 4: { case cmPeek: {
Command_RevealCards *cmd = new Command_RevealCards;
cmd->set_zone_name(card->getZone()->getName().toStdString());
cmd->set_card_id(card->getId());
cmd->set_player_id(id);
commandList.append(cmd);
break;
}
case cmClone: {
Command_CreateToken *cmd = new Command_CreateToken; Command_CreateToken *cmd = new Command_CreateToken;
cmd->set_zone(card->getZone()->getName().toStdString()); cmd->set_zone(card->getZone()->getName().toStdString());
cmd->set_card_name(card->getName().toStdString()); cmd->set_card_name(card->getName().toStdString());
@ -1662,8 +1690,8 @@ void Player::cardMenuAction()
int startPlayerId = cardList[0]->getZone()->getPlayer()->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 (static_cast<CardMenuActionType>(a->data().toInt())) {
case 5: { case cmMoveToTopLibrary: {
Command_MoveCard *cmd = new Command_MoveCard; Command_MoveCard *cmd = new Command_MoveCard;
cmd->set_start_player_id(startPlayerId); cmd->set_start_player_id(startPlayerId);
cmd->set_start_zone(startZone.toStdString()); cmd->set_start_zone(startZone.toStdString());
@ -1675,7 +1703,7 @@ void Player::cardMenuAction()
commandList.append(cmd); commandList.append(cmd);
break; break;
} }
case 6: { case cmMoveToBottomLibrary: {
Command_MoveCard *cmd = new Command_MoveCard; Command_MoveCard *cmd = new Command_MoveCard;
cmd->set_start_player_id(startPlayerId); cmd->set_start_player_id(startPlayerId);
cmd->set_start_zone(startZone.toStdString()); cmd->set_start_zone(startZone.toStdString());
@ -1687,7 +1715,7 @@ void Player::cardMenuAction()
commandList.append(cmd); commandList.append(cmd);
break; break;
} }
case 7: { case cmMoveToGraveyard: {
Command_MoveCard *cmd = new Command_MoveCard; Command_MoveCard *cmd = new Command_MoveCard;
cmd->set_start_player_id(startPlayerId); cmd->set_start_player_id(startPlayerId);
cmd->set_start_zone(startZone.toStdString()); cmd->set_start_zone(startZone.toStdString());
@ -1699,7 +1727,7 @@ void Player::cardMenuAction()
commandList.append(cmd); commandList.append(cmd);
break; break;
} }
case 8: { case cmMoveToExile: {
Command_MoveCard *cmd = new Command_MoveCard; Command_MoveCard *cmd = new Command_MoveCard;
cmd->set_start_player_id(startPlayerId); cmd->set_start_player_id(startPlayerId);
cmd->set_start_zone(startZone.toStdString()); cmd->set_start_zone(startZone.toStdString());
@ -1924,8 +1952,12 @@ void Player::actHide()
game->getActiveCard()->getZone()->removeCard(game->getActiveCard()); game->getActiveCard()->getZone()->removeCard(game->getActiveCard());
} }
void Player::updateCardMenu(CardItem *card, QMenu *cardMenu, QMenu *ptMenu, QMenu *moveMenu) void Player::updateCardMenu(CardItem *card)
{ {
QMenu *cardMenu = card->getCardMenu();
QMenu *ptMenu = card->getPTMenu();
QMenu *moveMenu = card->getMoveMenu();
cardMenu->clear(); cardMenu->clear();
bool revealedCard = false; bool revealedCard = false;
@ -1970,6 +2002,8 @@ void Player::updateCardMenu(CardItem *card, QMenu *cardMenu, QMenu *ptMenu, QMen
cardMenu->addAction(aUntap); cardMenu->addAction(aUntap);
cardMenu->addAction(aDoesntUntap); cardMenu->addAction(aDoesntUntap);
cardMenu->addAction(aFlip); cardMenu->addAction(aFlip);
if (card->getFaceDown())
cardMenu->addAction(aPeek);
cardMenu->addSeparator(); cardMenu->addSeparator();
cardMenu->addAction(aAttach); cardMenu->addAction(aAttach);
if (card->getAttachedTo()) if (card->getAttachedTo())

View file

@ -97,7 +97,7 @@ signals:
void logSetAnnotation(Player *player, CardItem *card, QString newAnnotation); void logSetAnnotation(Player *player, CardItem *card, QString newAnnotation);
void logDumpZone(Player *player, CardZone *zone, int numberCards); void logDumpZone(Player *player, CardZone *zone, int numberCards);
void logStopDumpZone(Player *player, CardZone *zone); void logStopDumpZone(Player *player, CardZone *zone);
void logRevealCards(Player *player, CardZone *zone, int cardId, QString cardName, Player *otherPlayer); void logRevealCards(Player *player, CardZone *zone, int cardId, QString cardName, Player *otherPlayer, bool faceDown);
void sizeChanged(); void sizeChanged();
void gameConceded(); void gameConceded();
@ -165,7 +165,7 @@ private:
QList<QAction *> aAddCounter, aSetCounter, aRemoveCounter; QList<QAction *> aAddCounter, aSetCounter, aRemoveCounter;
QAction *aPlay, QAction *aPlay,
*aHide, *aHide,
*aTap, *aUntap, *aDoesntUntap, *aAttach, *aUnattach, *aDrawArrow, *aSetPT, *aIncP, *aDecP, *aIncT, *aDecT, *aIncPT, *aDecPT, *aSetAnnotation, *aFlip, *aClone, *aTap, *aUntap, *aDoesntUntap, *aAttach, *aUnattach, *aDrawArrow, *aSetPT, *aIncP, *aDecP, *aIncT, *aDecT, *aIncPT, *aDecPT, *aSetAnnotation, *aFlip, *aPeek, *aClone,
*aMoveToTopLibrary, *aMoveToBottomLibrary, *aMoveToGraveyard, *aMoveToExile; *aMoveToTopLibrary, *aMoveToBottomLibrary, *aMoveToGraveyard, *aMoveToExile;
bool shortcutsActive; bool shortcutsActive;
@ -223,6 +223,7 @@ private:
void eventRevealCards(const Event_RevealCards &event); void eventRevealCards(const Event_RevealCards &event);
public: public:
static const int counterAreaWidth = 55; static const int counterAreaWidth = 55;
enum CardMenuActionType { cmTap, cmUntap, cmDoesntUntap, cmFlip, cmPeek, cmClone, cmMoveToTopLibrary, cmMoveToBottomLibrary, cmMoveToGraveyard, cmMoveToExile };
enum { Type = typeOther }; enum { Type = typeOther };
int type() const { return Type; } int type() const { return Type; }
@ -261,7 +262,7 @@ 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 updateCardMenu(CardItem *card, QMenu *cardMenu, QMenu *ptMenu, QMenu *moveMenu); void updateCardMenu(CardItem *card);
bool getActive() const { return active; } bool getActive() const { return active; }
void setActive(bool _active); void setActive(bool _active);
void setShortcutsActive(); void setShortcutsActive();

View file

@ -1065,7 +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*))); connect(card, SIGNAL(updateCardMenu(AbstractCardItem *)), this, SLOT(updateCardMenu(AbstractCardItem *)));
} }
CardItem *TabGame::getCard(int playerId, const QString &zoneName, int cardId) const CardItem *TabGame::getCard(int playerId, const QString &zoneName, int cardId) const
@ -1105,16 +1105,13 @@ Player *TabGame::getActiveLocalPlayer() const
return 0; return 0;
} }
#include <QDebug>
void TabGame::updateCardMenu(AbstractCardItem *card, QMenu *cardMenu, QMenu *ptMenu, QMenu *moveMenu) void TabGame::updateCardMenu(AbstractCardItem *card)
{ {
Player *p; Player *p;
if ((clients.size() > 1) || !players.contains(localPlayerId)) { if ((clients.size() > 1) || !players.contains(localPlayerId))
qDebug("BUG");
p = card->getOwner(); p = card->getOwner();
} else { else
p = players.value(localPlayerId); p = players.value(localPlayerId);
qDebug() << "GEFUNDEN" << localPlayerId << p->getName(); p->updateCardMenu(static_cast<CardItem *>(card));
}
p->updateCardMenu(static_cast<CardItem *>(card), cardMenu, ptMenu, moveMenu);
} }

View file

@ -178,7 +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 updateCardMenu(AbstractCardItem *card);
void actConcede(); void actConcede();
void actLeaveGame(); void actLeaveGame();

View file

@ -477,7 +477,7 @@ Response::ResponseCode Server_Player::moveCard(GameEventStorage &ges, Server_Car
publicCardName = card->getName(); publicCardName = card->getName();
int oldCardId = card->getId(); int oldCardId = card->getId();
if (faceDown || (targetzone->getPlayer() != startzone->getPlayer())) if ((faceDown && (startzone != targetzone)) || (targetzone->getPlayer() != startzone->getPlayer()))
card->setId(targetzone->getPlayer()->newCardId()); card->setId(targetzone->getPlayer()->newCardId());
card->setFaceDown(faceDown); card->setFaceDown(faceDown);
@ -506,7 +506,8 @@ Response::ResponseCode Server_Player::moveCard(GameEventStorage &ges, Server_Car
Event_MoveCard eventPrivate(eventOthers); Event_MoveCard eventPrivate(eventOthers);
eventPrivate.set_card_id(privateOldCardId); eventPrivate.set_card_id(privateOldCardId);
eventPrivate.set_card_name(privateCardName.toStdString()); if (!privateCardName.isEmpty())
eventPrivate.set_card_name(privateCardName.toStdString());
eventPrivate.set_position(privatePosition); eventPrivate.set_position(privatePosition);
eventPrivate.set_new_card_id(privateNewCardId); eventPrivate.set_new_card_id(privateNewCardId);
@ -524,7 +525,8 @@ Response::ResponseCode Server_Player::moveCard(GameEventStorage &ges, Server_Car
eventOthers.set_position(position); eventOthers.set_position(position);
if ((startzone->getType() == ServerInfo_Zone::PublicZone) || (targetzone->getType() == ServerInfo_Zone::PublicZone)) { if ((startzone->getType() == ServerInfo_Zone::PublicZone) || (targetzone->getType() == ServerInfo_Zone::PublicZone)) {
eventOthers.set_card_id(oldCardId); eventOthers.set_card_id(oldCardId);
eventOthers.set_card_name(publicCardName.toStdString()); if (!publicCardName.isEmpty())
eventOthers.set_card_name(publicCardName.toStdString());
eventOthers.set_new_card_id(card->getId()); eventOthers.set_new_card_id(card->getId());
} }
@ -900,7 +902,8 @@ Response::ResponseCode Server_Player::cmdFlipCard(const Command_FlipCard &cmd, R
Event_FlipCard event; Event_FlipCard event;
event.set_zone_name(zone->getName().toStdString()); event.set_zone_name(zone->getName().toStdString());
event.set_card_id(card->getId()); event.set_card_id(card->getId());
event.set_card_name(card->getName().toStdString()); if (!faceDown)
event.set_card_name(card->getName().toStdString());
event.set_face_down(faceDown); event.set_face_down(faceDown);
ges.enqueueGameEvent(event, playerId); ges.enqueueGameEvent(event, playerId);