From cbfbc542e783c54589b391fdcff027972e93e22d Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sat, 17 Jul 2010 23:37:22 +0200 Subject: [PATCH] disallow dropping a card onto another --- cockatrice/src/carddragitem.cpp | 29 +++++++++++++++++++++++++---- cockatrice/src/carddragitem.h | 2 ++ cockatrice/src/tablezone.cpp | 7 +++++++ cockatrice/src/tablezone.h | 1 + common/server_protocolhandler.cpp | 6 ++++++ 5 files changed, 41 insertions(+), 4 deletions(-) diff --git a/cockatrice/src/carddragitem.cpp b/cockatrice/src/carddragitem.cpp index ecadf058..5375bae0 100644 --- a/cockatrice/src/carddragitem.cpp +++ b/cockatrice/src/carddragitem.cpp @@ -5,12 +5,21 @@ #include #include #include +#include CardDragItem::CardDragItem(CardItem *_item, int _id, const QPointF &_hotSpot, bool _faceDown, AbstractCardDragItem *parentDrag) - : AbstractCardDragItem(_item, _hotSpot, parentDrag), id(_id), faceDown(_faceDown), currentZone(0) + : AbstractCardDragItem(_item, _hotSpot, parentDrag), id(_id), faceDown(_faceDown), occupied(false), currentZone(0) { } +void CardDragItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + AbstractCardDragItem::paint(painter, option, widget); + + if (occupied) + painter->fillRect(boundingRect(), QColor(200, 0, 0, 100)); +} + void CardDragItem::updatePosition(const QPointF &cursorScenePos) { QList colliding = scene()->items(cursorScenePos); @@ -36,12 +45,23 @@ void CardDragItem::updatePosition(const QPointF &cursorScenePos) QPointF zonePos = currentZone->scenePos(); QPointF cursorPosInZone = cursorScenePos - zonePos; QPointF cardTopLeft = cursorPosInZone - hotSpot; - QPointF newPos = zonePos + cursorZone->closestGridPoint(cardTopLeft); + QPointF closestGridPoint = cursorZone->closestGridPoint(cardTopLeft); + QPointF newPos = zonePos + closestGridPoint; if (newPos != pos()) { for (int i = 0; i < childDrags.size(); i++) childDrags[i]->setPos(newPos + childDrags[i]->getHotSpot()); setPos(newPos); + + bool newOccupied = false; + TableZone *table = qobject_cast(cursorZone); + if (table) + if (table->getCardFromCoords(closestGridPoint)) + newOccupied = true; + if (newOccupied != occupied) { + occupied = newOccupied; + update(); + } } } @@ -54,10 +74,11 @@ void CardDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) CardZone *startZone = static_cast(item)->getZone(); if (currentZone && !(static_cast(item)->getAttachedTo() && (startZone == currentZone))) { - currentZone->handleDropEvent(id, startZone, (sp - currentZone->scenePos()).toPoint(), faceDown); + if (!occupied) + currentZone->handleDropEvent(id, startZone, (sp - currentZone->scenePos()).toPoint(), faceDown); for (int i = 0; i < childDrags.size(); i++) { CardDragItem *c = static_cast(childDrags[i]); - if (!(static_cast(c->item)->getAttachedTo() && (startZone == currentZone))) + if (!(static_cast(c->item)->getAttachedTo() && (startZone == currentZone)) && !c->occupied) currentZone->handleDropEvent(c->id, startZone, (sp - currentZone->scenePos() + c->getHotSpot()).toPoint(), faceDown); sc->removeItem(c); } diff --git a/cockatrice/src/carddragitem.h b/cockatrice/src/carddragitem.h index dcaa13b8..82f1d66a 100644 --- a/cockatrice/src/carddragitem.h +++ b/cockatrice/src/carddragitem.h @@ -9,9 +9,11 @@ class CardDragItem : public AbstractCardDragItem { private: int id; bool faceDown; + bool occupied; CardZone *currentZone; public: CardDragItem(CardItem *_item, int _id, const QPointF &_hotSpot, bool _faceDown, AbstractCardDragItem *parentDrag = 0); + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void updatePosition(const QPointF &cursorScenePos); protected: void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); diff --git a/cockatrice/src/tablezone.cpp b/cockatrice/src/tablezone.cpp index dc63259a..70a5f999 100644 --- a/cockatrice/src/tablezone.cpp +++ b/cockatrice/src/tablezone.cpp @@ -202,6 +202,13 @@ CardItem *TableZone::getCardFromGrid(const QPoint &gridPoint) const return 0; } +CardItem *TableZone::getCardFromCoords(const QPointF &point) const +{ + QPoint gridPoint = mapToGrid(point); + return getCardFromGrid(gridPoint); +} + + QPointF TableZone::mapFromGrid(const QPoint &gridPoint) const { if ((gridPoint.y() == 3) && (settingsCache->getEconomicGrid())) diff --git a/cockatrice/src/tablezone.h b/cockatrice/src/tablezone.h index 3bef1229..a15bff21 100644 --- a/cockatrice/src/tablezone.h +++ b/cockatrice/src/tablezone.h @@ -30,6 +30,7 @@ public: void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown = false); void handleDropEventByGrid(int cardId, CardZone *startZone, const QPoint &gridPoint, bool faceDown = false, bool tapped = false); CardItem *getCardFromGrid(const QPoint &gridPoint) const; + CardItem *getCardFromCoords(const QPointF &point) const; QPointF mapFromGrid(const QPoint &gridPoint) const; QPoint mapToGrid(const QPointF &mapPoint) const; QPointF closestGridPoint(const QPointF &point); diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index e752588f..6251c631 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -512,6 +512,12 @@ ResponseCode Server_ProtocolHandler::moveCard(Server_Game *game, Server_Player * if ((!startzone) || (!targetzone)) return RespNameNotFound; + // Collision detection + if (targetzone->hasCoords()) + for (int i = 0; i < targetzone->cards.size(); ++i) + if ((targetzone->cards[i]->getX() == x) && (targetzone->cards[i]->getY() == y)) + return RespContextError; + int position = -1; Server_Card *card = startzone->getCard(_cardId, true, &position); if (!card)