Commit 9c527fb5 authored by Max-Wilhelm Bruker's avatar Max-Wilhelm Bruker
Browse files

Click to hide revealed cards; MultiMove function

parent f07bb38e
...@@ -72,17 +72,18 @@ void CardDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) ...@@ -72,17 +72,18 @@ void CardDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
QPointF sp = pos(); QPointF sp = pos();
sc->removeItem(this); sc->removeItem(this);
QList<CardDragItem *> dragItemList;
CardZone *startZone = static_cast<CardItem *>(item)->getZone(); CardZone *startZone = static_cast<CardItem *>(item)->getZone();
if (currentZone && !(static_cast<CardItem *>(item)->getAttachedTo() && (startZone == currentZone))) { if (currentZone && !(static_cast<CardItem *>(item)->getAttachedTo() && (startZone == currentZone))) {
if (!occupied) dragItemList.append(this);
currentZone->handleDropEvent(this, startZone, (sp - currentZone->scenePos()).toPoint(), faceDown);
for (int i = 0; i < childDrags.size(); i++) { for (int i = 0; i < childDrags.size(); i++) {
CardDragItem *c = static_cast<CardDragItem *>(childDrags[i]); CardDragItem *c = static_cast<CardDragItem *>(childDrags[i]);
if (!(static_cast<CardItem *>(c->item)->getAttachedTo() && (startZone == currentZone)) && !c->occupied) if (!(static_cast<CardItem *>(c->item)->getAttachedTo() && (startZone == currentZone)) && !c->occupied)
currentZone->handleDropEvent(static_cast<CardDragItem *>(c), startZone, (sp - currentZone->scenePos() + c->getHotSpot()).toPoint(), faceDown); dragItemList.append(c);
sc->removeItem(c); sc->removeItem(c);
} }
} }
currentZone->handleDropEvent(dragItemList, startZone, (sp - currentZone->scenePos()).toPoint(), faceDown);
event->accept(); event->accept();
} }
...@@ -16,8 +16,8 @@ ...@@ -16,8 +16,8 @@
#include "settingscache.h" #include "settingscache.h"
#include "tab_game.h" #include "tab_game.h"
CardItem::CardItem(Player *_owner, const QString &_name, int _cardid, QGraphicsItem *parent) CardItem::CardItem(Player *_owner, const QString &_name, int _cardid, bool _revealedCard, QGraphicsItem *parent)
: AbstractCardItem(_name, _owner, parent), zone(0), id(_cardid), attacking(false), facedown(false), destroyOnZoneChange(false), doesntUntap(false), dragItem(0), attachedTo(0) : AbstractCardItem(_name, _owner, parent), zone(0), id(_cardid), revealedCard(_revealedCard), attacking(false), facedown(false), destroyOnZoneChange(false), doesntUntap(false), dragItem(0), attachedTo(0)
{ {
owner->addCard(this); owner->addCard(this);
...@@ -59,6 +59,8 @@ CardItem::CardItem(Player *_owner, const QString &_name, int _cardid, QGraphicsI ...@@ -59,6 +59,8 @@ CardItem::CardItem(Player *_owner, const QString &_name, int _cardid, QGraphicsI
aPlay = new QAction(this); aPlay = new QAction(this);
connect(aPlay, SIGNAL(triggered()), this, SLOT(actPlay())); connect(aPlay, SIGNAL(triggered()), this, SLOT(actPlay()));
aHide = new QAction(this);
connect(aHide, SIGNAL(triggered()), this, SLOT(actHide()));
for (int i = 0; i < 3; ++i) { for (int i = 0; i < 3; ++i) {
QAction *tempAddCounter = new QAction(this); QAction *tempAddCounter = new QAction(this);
...@@ -128,7 +130,9 @@ void CardItem::updateCardMenu() ...@@ -128,7 +130,9 @@ void CardItem::updateCardMenu()
{ {
cardMenu->clear(); cardMenu->clear();
if (owner->getLocal()) { if (revealedCard)
cardMenu->addAction(aHide);
else if (owner->getLocal()) {
if (zone) { if (zone) {
if (zone->getName() == "table") { if (zone->getName() == "table") {
cardMenu->addAction(aTap); cardMenu->addAction(aTap);
...@@ -169,6 +173,7 @@ void CardItem::updateCardMenu() ...@@ -169,6 +173,7 @@ void CardItem::updateCardMenu()
void CardItem::retranslateUi() void CardItem::retranslateUi()
{ {
aPlay->setText(tr("&Play")); aPlay->setText(tr("&Play"));
aHide->setText(tr("&Hide"));
aTap->setText(tr("&Tap")); aTap->setText(tr("&Tap"));
aUntap->setText(tr("&Untap")); aUntap->setText(tr("&Untap"));
...@@ -426,6 +431,9 @@ void CardItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) ...@@ -426,6 +431,9 @@ 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)
actHide();
else
playCard(event->modifiers().testFlag(Qt::ShiftModifier)); playCard(event->modifiers().testFlag(Qt::ShiftModifier));
} }
...@@ -434,8 +442,12 @@ void CardItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) ...@@ -434,8 +442,12 @@ void CardItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
void CardItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) void CardItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{ {
if (settingsCache->getDoubleClickToPlay()) if (settingsCache->getDoubleClickToPlay()) {
if (revealedCard)
actHide();
else
playCard(event->modifiers().testFlag(Qt::ShiftModifier)); playCard(event->modifiers().testFlag(Qt::ShiftModifier));
}
event->accept(); event->accept();
} }
...@@ -484,3 +496,8 @@ void CardItem::actPlay() ...@@ -484,3 +496,8 @@ void CardItem::actPlay()
{ {
playCard(false); playCard(false);
} }
void CardItem::actHide()
{
zone->removeCard(this);
}
\ No newline at end of file
...@@ -17,6 +17,7 @@ class CardItem : public AbstractCardItem { ...@@ -17,6 +17,7 @@ class CardItem : public AbstractCardItem {
private: private:
CardZone *zone; CardZone *zone;
int id; int id;
bool revealedCard;
bool attacking; bool attacking;
bool facedown; bool facedown;
QMap<int, int> counters; QMap<int, int> counters;
...@@ -31,6 +32,7 @@ private: ...@@ -31,6 +32,7 @@ private:
QList<QAction *> aAddCounter, aSetCounter, aRemoveCounter; QList<QAction *> aAddCounter, aSetCounter, aRemoveCounter;
QAction *aPlay, QAction *aPlay,
*aHide,
*aTap, *aUntap, *aDoesntUntap, *aAttach, *aUnattach, *aSetPT, *aSetAnnotation, *aFlip, *aClone, *aTap, *aUntap, *aDoesntUntap, *aAttach, *aUnattach, *aSetPT, *aSetAnnotation, *aFlip, *aClone,
*aMoveToTopLibrary, *aMoveToBottomLibrary, *aMoveToGraveyard, *aMoveToExile; *aMoveToTopLibrary, *aMoveToBottomLibrary, *aMoveToGraveyard, *aMoveToExile;
QMenu *cardMenu, *moveMenu; QMenu *cardMenu, *moveMenu;
...@@ -45,12 +47,13 @@ private slots: ...@@ -45,12 +47,13 @@ private slots:
void actSetPT(); void actSetPT();
void actSetAnnotation(); void actSetAnnotation();
void actPlay(); void actPlay();
void actHide();
public slots: public slots:
void deleteLater(); void deleteLater();
public: public:
enum { Type = typeCard }; enum { Type = typeCard };
int type() const { return Type; } int type() const { return Type; }
CardItem(Player *_owner, const QString &_name = QString(), int _cardid = -1, QGraphicsItem *parent = 0); CardItem(Player *_owner, const QString &_name = QString(), int _cardid = -1, bool revealedCard = false, QGraphicsItem *parent = 0);
~CardItem(); ~CardItem();
void retranslateUi(); void retranslateUi();
CardZone *getZone() const { return zone; } CardZone *getZone() const { return zone; }
......
...@@ -157,16 +157,25 @@ CardItem *CardZone::takeCard(int position, int cardId, bool /*canResize*/) ...@@ -157,16 +157,25 @@ CardItem *CardZone::takeCard(int position, int cardId, bool /*canResize*/)
return c; return c;
} }
void CardZone::removeCard(CardItem *card)
{
cards.removeAt(cards.indexOf(card));
reorganizeCards();
emit cardCountChanged();
player->deleteCard(card);
}
void CardZone::moveAllToZone() void CardZone::moveAllToZone()
{ {
QList<QVariant> data = static_cast<QAction *>(sender())->data().toList(); QList<QVariant> data = static_cast<QAction *>(sender())->data().toList();
QString targetZone = data[0].toString(); QString targetZone = data[0].toString();
int targetX = data[1].toInt(); int targetX = data[1].toInt();
// Cards need to be moved in reverse order so that the other QList<CardId *> idList;
// cards' list index doesn't change for (int i = 0; i < cards.size(); ++i)
for (int i = cards.size() - 1; i >= 0; i--) idList.append(new CardId(cards[i]->getId()));
player->sendGameCommand(new Command_MoveCard(-1, getName(), cards.at(i)->getId(), player->getId(), targetZone, targetX));
player->sendGameCommand(new Command_MoveCard(-1, getName(), idList, player->getId(), targetZone, targetX));
} }
QPointF CardZone::closestGridPoint(const QPointF &point) QPointF CardZone::closestGridPoint(const QPointF &point)
......
...@@ -35,7 +35,7 @@ public slots: ...@@ -35,7 +35,7 @@ public slots:
public: public:
enum { Type = typeZone }; enum { Type = typeZone };
int type() const { return Type; } int type() const { return Type; }
virtual void handleDropEvent(CardDragItem *dragItem, CardZone *startZone, const QPoint &dropPoint, bool faceDown) = 0; virtual void handleDropEvent(const QList<CardDragItem *> &dragItem, CardZone *startZone, const QPoint &dropPoint, bool faceDown) = 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();
...@@ -54,6 +54,7 @@ public: ...@@ -54,6 +54,7 @@ public:
CardItem *getCard(int cardId, const QString &cardName); CardItem *getCard(int cardId, const QString &cardName);
// takeCard() finds a card by position and removes it from the zone and from all of its views. // takeCard() finds a card by position and removes it from the zone and from all of its views.
virtual CardItem *takeCard(int position, int cardId, bool canResize = true); virtual CardItem *takeCard(int position, int cardId, bool canResize = true);
void removeCard(CardItem *card);
ZoneViewZone *getView() const { return view; } ZoneViewZone *getView() const { return view; }
void setView(ZoneViewZone *_view) { view = _view; } void setView(ZoneViewZone *_view) { view = _view; }
virtual void reorganizeCards() = 0; virtual void reorganizeCards() = 0;
......
...@@ -37,9 +37,13 @@ void HandZone::addCardImpl(CardItem *card, int x, int /*y*/) ...@@ -37,9 +37,13 @@ void HandZone::addCardImpl(CardItem *card, int x, int /*y*/)
card->update(); card->update();
} }
void HandZone::handleDropEvent(CardDragItem *dragItem, CardZone *startZone, const QPoint &/*dropPoint*/, bool /*faceDown*/) void HandZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &/*dropPoint*/, bool /*faceDown*/)
{ {
player->sendGameCommand(new Command_MoveCard(-1, startZone->getName(), dragItem->getId(), player->getId(), getName(), cards.size(), -1, false)); QList<CardId *> idList;
for (int i = 0; i < dragItems.size(); ++i)
idList.append(new CardId(dragItems[i]->getId()));
player->sendGameCommand(new Command_MoveCard(-1, startZone->getName(), idList, player->getId(), getName(), cards.size(), -1, false));
} }
QRectF HandZone::boundingRect() const QRectF HandZone::boundingRect() const
......
...@@ -14,7 +14,7 @@ public slots: ...@@ -14,7 +14,7 @@ public slots:
void updateOrientation(); void updateOrientation();
public: public:
HandZone(Player *_p, bool _contentsKnown, int _zoneHeight, QGraphicsItem *parent = 0); HandZone(Player *_p, bool _contentsKnown, int _zoneHeight, QGraphicsItem *parent = 0);
void handleDropEvent(CardDragItem *dragItem, CardZone *startZone, const QPoint &dropPoint, bool faceDown); void handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &dropPoint, bool faceDown);
QRectF boundingRect() const; QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void reorganizeCards(); void reorganizeCards();
......
...@@ -48,9 +48,13 @@ void PileZone::addCardImpl(CardItem *card, int x, int /*y*/) ...@@ -48,9 +48,13 @@ void PileZone::addCardImpl(CardItem *card, int x, int /*y*/)
card->setParentItem(this); card->setParentItem(this);
} }
void PileZone::handleDropEvent(CardDragItem *dragItem, CardZone *startZone, const QPoint &/*dropPoint*/, bool /*faceDown*/) void PileZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &/*dropPoint*/, bool /*faceDown*/)
{ {
player->sendGameCommand(new Command_MoveCard(-1, startZone->getName(), dragItem->getId(), player->getId(), getName(), 0, 0, false)); QList<CardId *> idList;
for (int i = 0; i < dragItems.size(); ++i)
idList.append(new CardId(dragItems[i]->getId()));
player->sendGameCommand(new Command_MoveCard(-1, startZone->getName(), idList, player->getId(), getName(), 0, 0, false));
} }
void PileZone::reorganizeCards() void PileZone::reorganizeCards()
......
...@@ -9,7 +9,7 @@ public: ...@@ -9,7 +9,7 @@ public:
QRectF boundingRect() const; QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void reorganizeCards(); void reorganizeCards();
void handleDropEvent(CardDragItem *dragItem, CardZone *startZone, const QPoint &dropPoint, bool faceDown); void handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &dropPoint, bool faceDown);
protected: protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event); void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseMoveEvent(QGraphicsSceneMouseEvent *event); void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
......
...@@ -563,9 +563,10 @@ void Player::actMoveTopCardsToGrave() ...@@ -563,9 +563,10 @@ void Player::actMoveTopCardsToGrave()
const int maxCards = zones.value("deck")->getCards().size(); const int maxCards = zones.value("deck")->getCards().size();
if (number > maxCards) if (number > maxCards)
number = maxCards; number = maxCards;
QList<CardId *> idList;
for (int i = 0; i < number; ++i) for (int i = 0; i < number; ++i)
commandList.append(new Command_MoveCard(-1, "deck", 0, getId(), "grave", 0, 0, false)); idList.append(new CardId(i));
sendCommandContainer(new CommandContainer(commandList)); sendGameCommand(new Command_MoveCard(-1, "deck", idList, getId(), "grave", 0, 0, false));
} }
void Player::actMoveTopCardsToExile() void Player::actMoveTopCardsToExile()
...@@ -578,14 +579,15 @@ void Player::actMoveTopCardsToExile() ...@@ -578,14 +579,15 @@ void Player::actMoveTopCardsToExile()
const int maxCards = zones.value("deck")->getCards().size(); const int maxCards = zones.value("deck")->getCards().size();
if (number > maxCards) if (number > maxCards)
number = maxCards; number = maxCards;
QList<CardId *> idList;
for (int i = 0; i < number; ++i) for (int i = 0; i < number; ++i)
commandList.append(new Command_MoveCard(-1, "deck", 0, getId(), "rfg", 0, 0, false)); idList.append(new CardId(i));
sendCommandContainer(new CommandContainer(commandList)); sendGameCommand(new Command_MoveCard(-1, "deck", idList, getId(), "rfg", 0, 0, false));
} }
void Player::actMoveTopCardToBottom() void Player::actMoveTopCardToBottom()
{ {
sendGameCommand(new Command_MoveCard(-1, "deck", 0, getId(), "deck", -1, 0, false)); sendGameCommand(new Command_MoveCard(-1, "deck", QList<CardId *>() << new CardId(0), getId(), "deck", -1, 0, false));
} }
void Player::actUntapAll() void Player::actUntapAll()
...@@ -1088,10 +1090,10 @@ void Player::playCard(CardItem *c, bool faceDown, bool tapped) ...@@ -1088,10 +1090,10 @@ void Player::playCard(CardItem *c, bool faceDown, bool tapped)
{ {
CardInfo *ci = c->getInfo(); CardInfo *ci = c->getInfo();
if (ci->getTableRow() == 3) if (ci->getTableRow() == 3)
sendGameCommand(new Command_MoveCard(-1, c->getZone()->getName(), c->getId(), getId(), "stack", 0, 0, false)); sendGameCommand(new Command_MoveCard(-1, c->getZone()->getName(), QList<CardId *>() << new CardId(c->getId()), getId(), "stack", 0, 0, false));
else { else {
QPoint gridPoint = QPoint(-1, 2 - ci->getTableRow()); QPoint gridPoint = QPoint(-1, 2 - ci->getTableRow());
sendGameCommand(new Command_MoveCard(-1, c->getZone()->getName(), c->getId(), getId(), "table", gridPoint.x(), gridPoint.y(), faceDown, tapped)); sendGameCommand(new Command_MoveCard(-1, c->getZone()->getName(), QList<CardId *>() << new CardId(c->getId()), getId(), "table", gridPoint.x(), gridPoint.y(), faceDown, tapped));
} }
} }
...@@ -1276,11 +1278,14 @@ bool Player::clearCardsToDelete() ...@@ -1276,11 +1278,14 @@ bool Player::clearCardsToDelete()
void Player::cardMenuAction(QAction *a) void Player::cardMenuAction(QAction *a)
{ {
QList<QGraphicsItem *> sel = scene()->selectedItems(); QList<QGraphicsItem *> sel = scene()->selectedItems();
QList<Command *> commandList; QList<CardItem *> cardList;
while (!sel.isEmpty()) { while (!sel.isEmpty())
unsigned int i = (unsigned int) (((double) sel.size()) * qrand() / (RAND_MAX + 1.0)); cardList.append(qgraphicsitem_cast<CardItem *>(sel.takeFirst()));
CardItem *card = qgraphicsitem_cast<CardItem *>(sel.takeAt(i));
QList<Command *> commandList;
if (a->data().toInt() <= 4)
for (int i = 0; i < cardList.size(); ++i) {
CardItem *card = cardList[i];
switch (a->data().toInt()) { switch (a->data().toInt()) {
case 0: case 0:
if (!card->getTapped()) if (!card->getTapped())
...@@ -1301,17 +1306,26 @@ void Player::cardMenuAction(QAction *a) ...@@ -1301,17 +1306,26 @@ void Player::cardMenuAction(QAction *a)
case 4: case 4:
commandList.append(new Command_CreateToken(-1, card->getZone()->getName(), card->getName(), card->getColor(), card->getPT(), card->getAnnotation(), true, -1, card->getGridPoint().y())); commandList.append(new Command_CreateToken(-1, card->getZone()->getName(), card->getName(), card->getColor(), card->getPT(), card->getAnnotation(), true, -1, card->getGridPoint().y()));
break; break;
}
}
else {
QList<CardId *> idList;
for (int i = 0; i < cardList.size(); ++i)
idList.append(new CardId(cardList[i]->getId()));
QString startZone = cardList[0]->getZone()->getName();
switch (a->data().toInt()) {
case 5: case 5:
commandList.append(new Command_MoveCard(-1, card->getZone()->getName(), card->getId(), getId(), "deck", 0, 0, false)); commandList.append(new Command_MoveCard(-1, startZone, idList, getId(), "deck", 0, 0, false));
break; break;
case 6: case 6:
commandList.append(new Command_MoveCard(-1, card->getZone()->getName(), card->getId(), getId(), "deck", -1, 0, false)); commandList.append(new Command_MoveCard(-1, startZone, idList, getId(), "deck", -1, 0, false));
break; break;
case 7: case 7:
commandList.append(new Command_MoveCard(-1, card->getZone()->getName(), card->getId(), getId(), "grave", 0, 0, false)); commandList.append(new Command_MoveCard(-1, startZone, idList, getId(), "grave", 0, 0, false));
break; break;
case 8: case 8:
commandList.append(new Command_MoveCard(-1, card->getZone()->getName(), card->getId(), getId(), "rfg", 0, 0, false)); commandList.append(new Command_MoveCard(-1, startZone, idList, getId(), "rfg", 0, 0, false));
break; break;
default: ; default: ;
} }
......
...@@ -52,11 +52,16 @@ void StackZone::paint(QPainter *painter, const QStyleOptionGraphicsItem */*optio ...@@ -52,11 +52,16 @@ void StackZone::paint(QPainter *painter, const QStyleOptionGraphicsItem */*optio
painter->fillRect(boundingRect(), QBrush(bgPixmap)); painter->fillRect(boundingRect(), QBrush(bgPixmap));
} }
void StackZone::handleDropEvent(CardDragItem *dragItem, CardZone *startZone, const QPoint &/*dropPoint*/, bool /*faceDown*/) void StackZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &/*dropPoint*/, bool /*faceDown*/)
{ {
if (startZone == this) if (startZone == this)
return; return;
player->sendGameCommand(new Command_MoveCard(-1, startZone->getName(), dragItem->getId(), player->getId(), getName(), 0, 0, false));
QList<CardId *> idList;
for (int i = 0; i < dragItems.size(); ++i)
idList.append(new CardId(dragItems[i]->getId()));
player->sendGameCommand(new Command_MoveCard(-1, startZone->getName(), idList, player->getId(), getName(), 0, 0, false));
} }
void StackZone::reorganizeCards() void StackZone::reorganizeCards()
......
...@@ -12,7 +12,7 @@ private slots: ...@@ -12,7 +12,7 @@ private slots:
void updateBgPixmap(); void updateBgPixmap();
public: public:
StackZone(Player *_p, int _zoneHeight, QGraphicsItem *parent = 0); StackZone(Player *_p, int _zoneHeight, QGraphicsItem *parent = 0);
void handleDropEvent(CardDragItem *dragItem, CardZone *startZone, const QPoint &dropPoint, bool faceDown); void handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &dropPoint, bool faceDown);
QRectF boundingRect() const; QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void reorganizeCards(); void reorganizeCards();
......
...@@ -85,14 +85,18 @@ void TableZone::addCardImpl(CardItem *card, int _x, int _y) ...@@ -85,14 +85,18 @@ void TableZone::addCardImpl(CardItem *card, int _x, int _y)
card->update(); card->update();
} }
void TableZone::handleDropEvent(CardDragItem *dragItem, CardZone *startZone, const QPoint &dropPoint, bool faceDown) void TableZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &dropPoint, bool faceDown)
{ {
handleDropEventByGrid(dragItem, startZone, mapToGrid(dropPoint), faceDown); handleDropEventByGrid(dragItems, startZone, mapToGrid(dropPoint), faceDown);
} }
void TableZone::handleDropEventByGrid(CardDragItem *dragItem, CardZone *startZone, const QPoint &gridPoint, bool faceDown, bool tapped) void TableZone::handleDropEventByGrid(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &gridPoint, bool faceDown, bool tapped)
{ {
static_cast<CardItem *>(dragItem->getItem())->getZone()->getPlayer()->sendGameCommand(new Command_MoveCard(-1, startZone->getName(), dragItem->getId(), player->getId(), getName(), gridPoint.x(), gridPoint.y(), faceDown, tapped)); QList<CardId *> idList;
for (int i = 0; i < dragItems.size(); ++i)
idList.append(new CardId(dragItems[i]->getId()));
startZone->getPlayer()->sendGameCommand(new Command_MoveCard(-1, startZone->getName(), idList, player->getId(), getName(), gridPoint.x(), gridPoint.y(), faceDown, tapped));
} }
void TableZone::reorganizeCards() void TableZone::reorganizeCards()
......
...@@ -29,8 +29,8 @@ public: ...@@ -29,8 +29,8 @@ public:
QRectF boundingRect() const; QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void toggleTapped(); void toggleTapped();
void handleDropEvent(CardDragItem *dragItem, CardZone *startZone, const QPoint &dropPoint, bool faceDown = false); void handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &dropPoint, bool faceDown = false);
void handleDropEventByGrid(CardDragItem *dragItem, CardZone *startZone, const QPoint &gridPoint, bool faceDown = false, bool tapped = false); void handleDropEventByGrid(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &gridPoint, bool faceDown = false, bool tapped = false);
CardItem *getCardFromGrid(const QPoint &gridPoint) const; CardItem *getCardFromGrid(const QPoint &gridPoint) const;
CardItem *getCardFromCoords(const QPointF &point) const; CardItem *getCardFromCoords(const QPointF &point) const;
QPointF mapFromGrid(QPoint gridPoint) const; QPointF mapFromGrid(QPoint gridPoint) const;
......
...@@ -33,7 +33,7 @@ void ZoneViewZone::initializeCards(const QList<ServerInfo_Card *> &cardList) ...@@ -33,7 +33,7 @@ void ZoneViewZone::initializeCards(const QList<ServerInfo_Card *> &cardList)
{ {
if (!cardList.isEmpty()) { if (!cardList.isEmpty()) {
for (int i = 0; i < cardList.size(); ++i) for (int i = 0; i < cardList.size(); ++i)
addCard(new CardItem(player, cardList[i]->getName(), cardList[i]->getId(), this), false, i); addCard(new CardItem(player, cardList[i]->getName(), cardList[i]->getId(), revealZone, this), false, i);
reorganizeCards(); reorganizeCards();
} else if (!origZone->contentsKnown()) { } else if (!origZone->contentsKnown()) {
Command_DumpZone *command = new Command_DumpZone(-1, player->getId(), name, numberCards); Command_DumpZone *command = new Command_DumpZone(-1, player->getId(), name, numberCards);
...@@ -44,7 +44,7 @@ void ZoneViewZone::initializeCards(const QList<ServerInfo_Card *> &cardList) ...@@ -44,7 +44,7 @@ void ZoneViewZone::initializeCards(const QList<ServerInfo_Card *> &cardList)
int number = numberCards == -1 ? c.size() : (numberCards < c.size() ? numberCards : c.size()); int number = numberCards == -1 ? c.size() : (numberCards < c.size() ? numberCards : c.size());
for (int i = 0; i < number; i++) { for (int i = 0; i < number; i++) {
CardItem *card = c.at(i); CardItem *card = c.at(i);
addCard(new CardItem(player, card->getName(), card->getId(), this), false, i); addCard(new CardItem(player, card->getName(), card->getId(), revealZone, this), false, i);
} }
reorganizeCards(); reorganizeCards();
} }
...@@ -58,7 +58,7 @@ void ZoneViewZone::zoneDumpReceived(ProtocolResponse *r) ...@@ -58,7 +58,7 @@ void ZoneViewZone::zoneDumpReceived(ProtocolResponse *r)
const QList<ServerInfo_Card *> &respCardList = resp->getZone()->getCardList(); const QList<ServerInfo_Card *> &respCardList = resp->getZone()->getCardList();
for (int i = 0; i < respCardList.size(); i++) { for (int i = 0; i < respCardList.size(); i++) {
CardItem *card = new CardItem(player, respCardList[i]->getName(), respCardList[i]->getId(), this); CardItem *card = new CardItem(player, respCardList[i]->getName(), respCardList[i]->getId(), revealZone, this);
addCard(card, false, i); addCard(card, false, i);
} }
...@@ -87,7 +87,6 @@ void ZoneViewZone::reorganizeCards() ...@@ -87,7 +87,6 @@ void ZoneViewZone::reorganizeCards()
cols = 2; cols = 2;
qDebug() << "reorganizeCards: rows=" << rows << "cols=" << cols; qDebug() << "reorganizeCards: rows=" << rows << "cols=" << cols;
qDebug() << "SORT BY NAME:" << sortByName << "SORT BY TYPE:" << sortByType;
CardList cardsToDisplay(cards); CardList cardsToDisplay(cards);
if (sortByName || sortByType) if (sortByName || sortByType)
...@@ -125,9 +124,13 @@ void ZoneViewZone::addCardImpl(CardItem *card, int x, int /*y*/) ...@@ -125,9 +124,13 @@ void ZoneViewZone::addCardImpl(CardItem *card, int x, int /*y*/)
card->update(); card->update();
} }
void ZoneViewZone::handleDropEvent(CardDragItem *dragItem, CardZone *startZone, const QPoint &/*dropPoint*/, bool /*faceDown*/) void ZoneViewZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &/*dropPoint*/, bool /*faceDown*/)
{ {
player->sendGameCommand(new Command_MoveCard(-1, startZone->getName(), dragItem->getId(), player->getId(), getName(), 0, 0, false)); QList<CardId *> idList;
for (int i = 0; i < dragItems.size(); ++i)
idList.append(new CardId(dragItems[i]->getId()));
player->sendGameCommand(new Command_MoveCard(-1, startZone->getName(), idList, player->getId(), getName(), 0, 0, false));
} }
void ZoneViewZone::removeCard(int position) void ZoneViewZone::removeCard(int position)
......
...@@ -13,7 +13,7 @@ class ZoneViewZone : public SelectZone, public QGraphicsLayoutItem { ...@@ -13,7 +13,7 @@ class ZoneViewZone : public SelectZone, public QGraphicsLayoutItem {
private: private:
QRectF bRect, optimumRect; QRectF bRect, optimumRect;
int minRows, numberCards; int minRows, numberCards;
void handleDropEvent(CardDragItem *dragItem, CardZone *startZone, const QPoint &dropPoint, bool faceDown); void handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &dropPoint, bool faceDown);
CardZone *origZone; CardZone *origZone;
bool revealZone; bool revealZone;
bool sortByName, sortByType; bool sortByName, sortByType;
......
...@@ -27,6 +27,7 @@ void ProtocolItem::initializeHash() ...@@ -27,6 +27,7 @@ void ProtocolItem::initializeHash()
registerSerializableItem("player_ping", ServerInfo_PlayerPing::newItem); registerSerializableItem("player_ping", ServerInfo_PlayerPing::newItem);
registerSerializableItem("file", DeckList_File::newItem); registerSerializableItem("file", DeckList_File::newItem);
registerSerializableItem("directory", DeckList_Directory::newItem); registerSerializableItem("directory", DeckList_Directory::newItem);
registerSerializableItem("card_id", CardId::newItem);
registerSerializableItem("containercmd", CommandContainer::newItem); registerSerializableItem("containercmd", CommandContainer::newItem);
registerSerializableItem("containergame_event", GameEventContainer::newItem); registerSerializableItem("containergame_event", GameEventContainer::newItem);
...@@ -34,6 +35,7 @@ void ProtocolItem::initializeHash() ...@@ -34,6 +35,7 @@ void ProtocolItem::initializeHash()
registerSerializableItem("cmddeck_upload", Command_DeckUpload::newItem); registerSerializableItem("cmddeck_upload", Command_DeckUpload::newItem);
registerSerializableItem("cmddeck_select", Command_DeckSelect::newItem); registerSerializableItem("cmddeck_select", Command_DeckSelect::newItem);
registerSerializableItem("cmdset_sideboard_plan", Command_SetSideboardPlan::newItem); registerSerializableItem("cmdset_sideboard_plan", Command_SetSideboardPlan::newItem);
registerSerializableItem("cmdmove_card", Command_MoveCard::newItem);
registerSerializableItem("resp", ProtocolResponse::newItem); registerSerializableItem("resp", ProtocolResponse::newItem);
ProtocolResponse::initializeHash(); ProtocolResponse::initializeHash();
...@@ -198,6 +200,21 @@ QList<MoveCardToZone *> Command_SetSideboardPlan::getMoveList() const ...@@ -198,6 +200,21 @@ QList<MoveCardToZone *> Command_SetSideboardPlan::getMoveList() const
return typecastItemList<MoveCardToZone *>(); return typecastItemList<MoveCardToZone *>();
} }
Command_MoveCard::Command_MoveCard(int _gameId, const QString &_startZone, const QList<CardId *> &_cardIds, int _targetPlayerId, const QString &_targetZone, int _x, int _y, bool _faceDown, bool _tapped)
: GameCommand("move_card", _gameId)
{
insertItem(new SerializableItem_String("start_zone", _startZone));
insertItem(new SerializableItem_Int("target_player_id", _targetPlayerId));
insertItem(new SerializableItem_String("target_zone", _targetZone));
insertItem(new SerializableItem_Int("x", _x));
insertItem(new SerializableItem_Int("y", _y));
insertItem(new SerializableItem_Bool("face_down", _faceDown));
insertItem(new SerializableItem_Bool("tapped", _tapped));
for (int i = 0; i < _cardIds.size(); ++i)
itemList.append(_cardIds[i]);
}
QHash<QString, ResponseCode> ProtocolResponse::responseHash; QHash<QString, ResponseCode> ProtocolResponse::responseHash;
ProtocolResponse::ProtocolResponse(int _cmdId, ResponseCode _responseCode, const QString &_itemName) ProtocolResponse::ProtocolResponse(int _cmdId, ResponseCode _responseCode, const QString &_itemName)
......
...@@ -25,6 +25,7 @@ enum ItemId { ...@@ -25,6 +25,7 @@ enum ItemId {
ItemId_Command_DeckUpload = ItemId_Other + 100, ItemId_Command_DeckUpload = ItemId_Other + 100,
ItemId_Command_DeckSelect = ItemId_Other + 101, ItemId_Command_DeckSelect = ItemId_Other + 101,
ItemId_Command_SetSideboardPlan = ItemId_Other + 102, ItemId_Command_SetSideboardPlan = ItemId_Other + 102,
ItemId_Command_MoveCard = ItemId_Other + 103,
ItemId_Event_ListRooms = ItemId_Other + 200, ItemId_Event_ListRooms = ItemId_Other + 200,
ItemId_Event_JoinRoom = ItemId_Other + 201, ItemId_Event_JoinRoom = ItemId_Other + 201,
ItemId_Event_ListGames = ItemId_Other + 203, ItemId_Event_ListGames = ItemId_Other + 203,
...@@ -189,6 +190,22 @@ public: ...@@ -189,6 +190,22 @@ public:
QList<MoveCardToZone *> getMoveList() const; QList<MoveCardToZone *> getMoveList() const;
}; };
class Command_MoveCard : public GameCommand {
Q_OBJECT
public:
Command_MoveCard(int _gameId = -1, const QString &_startZone = QString(), const QList<CardId *> &_cardIds = QList<CardId *>(), int _targetPlayerId = -1, const QString &_targetZone = QString(), int _x = -1, int _y = -1, bool _faceDown = false, bool _tapped = false);
QString getStartZone() const { return static_cast<SerializableItem_String *>(itemMap.value("start_zone"))->getData(); }
QList<CardId *> getCardIds() const { return typecastItemList<CardId *>(); }
int getTargetPlayerId() const { return static_cast<SerializableItem_Int *>(itemMap.value("target_player_id"))->getData(); }
QString getTargetZone() const { return static_cast<SerializableItem_String *>(itemMap.value("target_zone"))->getData(); }
int getX() const { return static_cast<SerializableItem_Int *>(itemMap.value("x"))->getData(); }
int getY() const { return static_cast<SerializableItem_Int *>(itemMap.value("y"))->getData(); }
bool getFaceDown() const { return static_cast<SerializableItem_Bool *>(itemMap.value("face_down"))->getData(); }
bool getTapped() const { return static_cast<SerializableItem_Bool *>(itemMap.value("tapped"))->getData(); }
static SerializableItem *newItem() { return new Command_MoveCard; }
int getItemId() const { return ItemId_Command_MoveCard; }
};
// ----------------- // -----------------
// --- RESPONSES --- // --- RESPONSES ---
// ----------------- // -----------------
......
...@@ -20,6 +20,12 @@ enum ResponseCode { RespNothing, RespOk, RespInvalidCommand, RespInvalidData, Re ...@@ -20,6 +20,12 @@ enum ResponseCode { RespNothing, RespOk, RespInvalidCommand, RespInvalidData, Re
// list index, whereas cards in any other zone are referenced by their ids. // list index, whereas cards in any other zone are referenced by their ids.
enum ZoneType { PrivateZone, PublicZone, HiddenZone }; enum ZoneType { PrivateZone, PublicZone, HiddenZone };
class CardId : public SerializableItem_Int {
public:
CardId(int _cardId = -1) : SerializableItem_Int("card_id", _cardId) { }
static SerializableItem *newItem() { return new CardId; }
};
class ServerInfo_User : public SerializableItem_Map { class ServerInfo_User : public SerializableItem_Map {
public: public:
enum UserLevelFlags { enum UserLevelFlags {
......
...@@ -21,53 +21,52 @@ ItemId_Command_Shuffle = 1019, ...@@ -21,53 +21,52 @@ ItemId_Command_Shuffle = 1019,
ItemId_Command_Mulligan = 1020, ItemId_Command_Mulligan = 1020,
ItemId_Command_RollDie = 1021, ItemId_Command_RollDie = 1021,
ItemId_Command_DrawCards = 1022, ItemId_Command_DrawCards = 1022,
ItemId_Command_MoveCard = 1023, ItemId_Command_FlipCard = 1023,
ItemId_Command_FlipCard = 1024, ItemId_Command_AttachCard = 1024,
ItemId_Command_AttachCard = 1025, ItemId_Command_CreateToken = 1025,
ItemId_Command_CreateToken = 1026, ItemId_Command_CreateArrow = 1026,
ItemId_Command_CreateArrow = 1027, ItemId_Command_DeleteArrow = 1027,
ItemId_Command_DeleteArrow = 1028, ItemId_Command_SetCardAttr = 1028,
ItemId_Command_SetCardAttr = 1029, ItemId_Command_SetCardCounter = 1029,
ItemId_Command_SetCardCounter = 1030, ItemId_Command_IncCardCounter = 1030,
ItemId_Command_IncCardCounter = 1031, ItemId_Command_ReadyStart = 1031,
ItemId_Command_ReadyStart = 1032, ItemId_Command_Concede = 1032,
ItemId_Command_Concede = 1033, ItemId_Command_IncCounter = 1033,
ItemId_Command_IncCounter = 1034, ItemId_Command_CreateCounter = 1034,
ItemId_Command_CreateCounter = 1035, ItemId_Command_SetCounter = 1035,
ItemId_Command_SetCounter = 1036, ItemId_Command_DelCounter = 1036,
ItemId_Command_DelCounter = 1037, ItemId_Command_NextTurn = 1037,
ItemId_Command_NextTurn = 1038, ItemId_Command_SetActivePhase = 1038,
ItemId_Command_SetActivePhase = 1039, ItemId_Command_DumpZone = 1039,
ItemId_Command_DumpZone = 1040, ItemId_Command_StopDumpZone = 1040,
ItemId_Command_StopDumpZone = 1041, ItemId_Command_RevealCards = 1041,
ItemId_Command_RevealCards = 1042, ItemId_Event_Say = 1042,
ItemId_Event_Say = 1043, ItemId_Event_Leave = 1043,
ItemId_Event_Leave = 1044, ItemId_Event_GameClosed = 1044,
ItemId_Event_GameClosed = 1045, ItemId_Event_Shuffle = 1045,
ItemId_Event_Shuffle = 1046, ItemId_Event_RollDie = 1046,
ItemId_Event_RollDie = 1047, ItemId_Event_MoveCard = 1047,
ItemId_Event_MoveCard = 1048, ItemId_Event_FlipCard = 1048,
ItemId_Event_FlipCard = 1049, ItemId_Event_DestroyCard = 1049,
ItemId_Event_DestroyCard = 1050, ItemId_Event_AttachCard = 1050,
ItemId_Event_AttachCard = 1051, ItemId_Event_CreateToken = 1051,
ItemId_Event_CreateToken = 1052, ItemId_Event_DeleteArrow = 1052,
ItemId_Event_DeleteArrow = 1053, ItemId_Event_SetCardAttr = 1053,
ItemId_Event_SetCardAttr = 1054, ItemId_Event_SetCardCounter = 1054,
ItemId_Event_SetCardCounter = 1055, ItemId_Event_SetCounter = 1055,
ItemId_Event_SetCounter = 1056, ItemId_Event_DelCounter = 1056,
ItemId_Event_DelCounter = 1057, ItemId_Event_SetActivePlayer = 1057,
ItemId_Event_SetActivePlayer = 1058, ItemId_Event_SetActivePhase = 1058,
ItemId_Event_SetActivePhase = 1059, ItemId_Event_DumpZone = 1059,
ItemId_Event_DumpZone = 1060, ItemId_Event_StopDumpZone = 1060,
ItemId_Event_StopDumpZone = 1061, ItemId_Event_ServerMessage = 1061,
ItemId_Event_ServerMessage = 1062, ItemId_Event_Message = 1062,
ItemId_Event_Message = 1063, ItemId_Event_GameJoined = 1063,
ItemId_Event_GameJoined = 1064, ItemId_Event_UserLeft = 1064,
ItemId_Event_UserLeft = 1065, ItemId_Event_LeaveRoom = 1065,
ItemId_Event_LeaveRoom = 1066, ItemId_Event_RoomSay = 1066,
ItemId_Event_RoomSay = 1067, ItemId_Context_ReadyStart = 1067,
ItemId_Context_ReadyStart = 1068, ItemId_Context_Concede = 1068,
ItemId_Context_Concede = 1069, ItemId_Context_DeckSelect = 1069,
ItemId_Context_DeckSelect = 1070, ItemId_Other = 1070
ItemId_Other = 1071
}; };
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment