From 55482246dd4973aea77f82f11b45d9374b19637d Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sun, 29 Nov 2009 03:35:55 +0100 Subject: [PATCH] zone view works --- cockatrice/src/zoneviewzone.cpp | 18 ++++++++++++------ cockatrice/src/zoneviewzone.h | 4 ++-- common/protocol.cpp | 9 +++++++++ common/protocol.h | 10 ++++++++++ common/server_protocolhandler.cpp | 19 +++++++++++++++---- 5 files changed, 48 insertions(+), 12 deletions(-) diff --git a/cockatrice/src/zoneviewzone.cpp b/cockatrice/src/zoneviewzone.cpp index 699765ee..63735d16 100644 --- a/cockatrice/src/zoneviewzone.cpp +++ b/cockatrice/src/zoneviewzone.cpp @@ -28,8 +28,9 @@ void ZoneViewZone::paint(QPainter */*painter*/, const QStyleOptionGraphicsItem * void ZoneViewZone::initializeCards() { if (!origZone->contentsKnown()) { -// PendingCommand_DumpZone *dumpZoneCommand = player->client->dumpZone(player->getId(), name, numberCards); -// connect(dumpZoneCommand, SIGNAL(cardListReceived(QList)), this, SLOT(zoneDumpReceived(QList))); + Command_DumpZone *command = new Command_DumpZone(-1, player->getId(), name, numberCards); + connect(command, SIGNAL(finished(ProtocolResponse *)), this, SLOT(zoneDumpReceived(ProtocolResponse *))); + player->sendGameCommand(command); } else { const CardList &c = origZone->getCards(); int number = numberCards == -1 ? c.size() : (numberCards < c.size() ? numberCards : c.size()); @@ -42,17 +43,22 @@ void ZoneViewZone::initializeCards() } } -/*void ZoneViewZone::zoneDumpReceived(QList cards) +void ZoneViewZone::zoneDumpReceived(ProtocolResponse *r) { - for (int i = 0; i < cards.size(); i++) { - CardItem *card = new CardItem(player, cards[i].getName(), i, this); + Response_DumpZone *resp = qobject_cast(r); + if (!resp) + return; + + const QList &respCardList = resp->getZone()->getCardList(); + for (int i = 0; i < respCardList.size(); i++) { + CardItem *card = new CardItem(player, respCardList[i]->getName(), respCardList[i]->getId(), this); addCard(card, false, i); } emit contentsChanged(); reorganizeCards(); } -*/ + // Because of boundingRect(), this function must not be called before the zone was added to a scene. void ZoneViewZone::reorganizeCards() { diff --git a/cockatrice/src/zoneviewzone.h b/cockatrice/src/zoneviewzone.h index ea92e261..69c57fc5 100644 --- a/cockatrice/src/zoneviewzone.h +++ b/cockatrice/src/zoneviewzone.h @@ -2,11 +2,11 @@ #define ZONEVIEWERZONE_H #include "cardzone.h" -#include "protocol_datastructures.h" #include #include class ZoneViewWidget; +class ProtocolResponse; class ZoneViewZone : public CardZone, public QGraphicsLayoutItem { Q_OBJECT @@ -29,7 +29,7 @@ public: public slots: void setSortingEnabled(int _sortingEnabled); private slots: -// void zoneDumpReceived(QList cards); + void zoneDumpReceived(ProtocolResponse *r); protected: void addCardImpl(CardItem *card, int x, int y); QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const; diff --git a/common/protocol.cpp b/common/protocol.cpp index 23465570..ed5c3b6b 100644 --- a/common/protocol.cpp +++ b/common/protocol.cpp @@ -33,6 +33,7 @@ void ProtocolItem::initializeHash() registerSerializableItem("respdeck_list", Response_DeckList::newItem); registerSerializableItem("respdeck_download", Response_DeckDownload::newItem); registerSerializableItem("respdeck_upload", Response_DeckUpload::newItem); + registerSerializableItem("respdump_zone", Response_DumpZone::newItem); registerSerializableItem("generic_eventlist_games", Event_ListGames::newItem); registerSerializableItem("generic_eventlist_chat_channels", Event_ListChatChannels::newItem); @@ -171,6 +172,14 @@ Response_DeckUpload::Response_DeckUpload(int _cmdId, ResponseCode _responseCode, insertItem(_file); } +Response_DumpZone::Response_DumpZone(int _cmdId, ResponseCode _responseCode, ServerInfo_Zone *_zone) + : ProtocolResponse(_cmdId, _responseCode, "dump_zone") +{ + if (!_zone) + _zone = new ServerInfo_Zone; + insertItem(_zone); +} + GameEvent::GameEvent(const QString &_eventName, int _gameId, int _playerId) : ProtocolItem("game_event", _eventName) { diff --git a/common/protocol.h b/common/protocol.h index 7cee3fce..58ebcf42 100644 --- a/common/protocol.h +++ b/common/protocol.h @@ -29,6 +29,7 @@ enum ItemId { ItemId_Response_DeckList = ItemId_Other + 300, ItemId_Response_DeckDownload = ItemId_Other + 301, ItemId_Response_DeckUpload = ItemId_Other + 302, + ItemId_Response_DumpZone = ItemId_Other + 303, ItemId_Invalid = ItemId_Other + 1000 }; @@ -172,6 +173,15 @@ public: DeckList_File *getFile() const { return static_cast(itemMap.value("file")); } }; +class Response_DumpZone : public ProtocolResponse { + Q_OBJECT +public: + Response_DumpZone(int _cmdId = -1, ResponseCode _responseCode = RespOk, ServerInfo_Zone *zone = 0); + int getItemId() const { return ItemId_Response_DumpZone; } + static SerializableItem *newItem() { return new Response_DumpZone; } + ServerInfo_Zone *getZone() const { return static_cast(itemMap.value("zone")); } +}; + // -------------- // --- EVENTS --- // -------------- diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index d7861f6d..8cff1115 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -554,11 +554,22 @@ ResponseCode Server_ProtocolHandler::cmdDumpZone(Command_DumpZone *cmd, Server_G if (!((zone->getType() == PublicZone) || (player == otherPlayer))) return RespContextError; - if (zone->getType() == HiddenZone) { -// game->broadcastEvent(QString("dump_zone|%1|%2|%3").arg(player_id).arg(zone->getName()).arg(number_cards), player); + int numberCards = cmd->getNumberCards(); + QList respCardList; + for (int i = 0; (i < zone->cards.size()) && (i < numberCards || numberCards == -1); ++i) { + Server_Card *card = zone->cards[i]; + QString displayedName = card->getFaceDown() ? QString() : card->getName(); + if (zone->getType() == HiddenZone) + respCardList.append(new ServerInfo_Card(i, displayedName)); + else + respCardList.append(new ServerInfo_Card(card->getId(), displayedName, card->getX(), card->getY(), card->getCounters(), card->getTapped(), card->getAttacking(), card->getAnnotation())); } -// remsg->sendList(dumpZoneHelper(otherPlayer, zone, number_cards)); - return RespOk; + if (zone->getType() == HiddenZone) { + zone->setCardsBeingLookedAt(numberCards); + game->sendGameEvent(new Event_DumpZone(-1, player->getPlayerId(), otherPlayer->getPlayerId(), zone->getName(), numberCards)); + } + sendProtocolItem(new Response_DumpZone(cmd->getCmdId(), RespOk, new ServerInfo_Zone(zone->getName(), zone->getType(), zone->hasCoords(), numberCards < zone->cards.size() ? zone->cards.size() : numberCards, respCardList))); + return RespNothing; } ResponseCode Server_ProtocolHandler::cmdStopDumpZone(Command_StopDumpZone *cmd, Server_Game *game, Server_Player *player)