ResponseCode Server_ProtocolHandler::cmdDumpZone(Command_DumpZone *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player) { if (!game->getGameStarted()) return RespGameNotStarted; Server_Player *otherPlayer = game->getPlayer(cmd->getPlayerId()); if (!otherPlayer) return RespNameNotFound; Server_CardZone *zone = otherPlayer->getZones().value(cmd->getZoneName()); if (!zone) return RespNameNotFound; if (!((zone->getType() == PublicZone) || (player == otherPlayer))) return RespContextError; int numberCards = cmd->getNumberCards(); QList<ServerInfo_Card *> 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 { QList<ServerInfo_CardCounter *> cardCounterList; QMapIterator<int, int> cardCounterIterator(card->getCounters()); while (cardCounterIterator.hasNext()) { cardCounterIterator.next(); cardCounterList.append(new ServerInfo_CardCounter(cardCounterIterator.key(), cardCounterIterator.value())); } int attachPlayerId = -1; QString attachZone; int attachCardId = -1; if (card->getParentCard()) { attachPlayerId = card->getParentCard()->getZone()->getPlayer()->getPlayerId(); attachZone = card->getParentCard()->getZone()->getName(); attachCardId = card->getParentCard()->getId(); } respCardList.append(new ServerInfo_Card(card->getId(), displayedName, card->getX(), card->getY(), card->getTapped(), card->getAttacking(), card->getColor(), card->getPT(), card->getAnnotation(), card->getDestroyOnZoneChange(), cardCounterList, attachPlayerId, attachZone, attachCardId)); } } if (zone->getType() == HiddenZone) { zone->setCardsBeingLookedAt(numberCards); game->sendGameEvent(new Event_DumpZone(player->getPlayerId(), otherPlayer->getPlayerId(), zone->getName(), numberCards)); } cont->setResponse(new Response_DumpZone(cont->getCmdId(), RespOk, new ServerInfo_Zone(zone->getName(), zone->getType(), zone->hasCoords(), numberCards < zone->cards.size() ? zone->cards.size() : numberCards, respCardList))); return RespNothing; }
void Server_Card::getInfo(ServerInfo_Card *info) { QString displayedName = facedown ? QString() : name; info->set_id(id); info->set_name(displayedName.toStdString()); info->set_x(coord_x); info->set_y(coord_y); QString ptStr = getPT(); if (facedown) { info->set_face_down(true); ptStr = getPT(); } info->set_tapped(tapped); if (attacking) info->set_attacking(true); if (!color.isEmpty()) info->set_color(color.toStdString()); if (!ptStr.isEmpty()) info->set_pt(ptStr.toStdString()); if (!annotation.isEmpty()) info->set_annotation(annotation.toStdString()); if (destroyOnZoneChange) info->set_destroy_on_zone_change(true); if (doesntUntap) info->set_doesnt_untap(true); QMapIterator<int, int> cardCounterIterator(counters); while (cardCounterIterator.hasNext()) { cardCounterIterator.next(); ServerInfo_CardCounter *counterInfo = info->add_counter_list(); counterInfo->set_id(cardCounterIterator.key()); counterInfo->set_value(cardCounterIterator.value()); } if (parentCard) { info->set_attach_player_id(parentCard->getZone()->getPlayer()->getPlayerId()); info->set_attach_zone(parentCard->getZone()->getName().toStdString()); info->set_attach_card_id(parentCard->getId()); } }
ResponseCode Server_ProtocolHandler::cmdRevealCards(Command_RevealCards *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player) { if (player->getSpectator()) return RespFunctionNotAllowed; if (!game->getGameStarted()) return RespGameNotStarted; Server_Player *otherPlayer = 0; if (cmd->getPlayerId() != -1) { otherPlayer = game->getPlayer(cmd->getPlayerId()); if (!otherPlayer) return RespNameNotFound; } Server_CardZone *zone = player->getZones().value(cmd->getZoneName()); if (!zone) return RespNameNotFound; QList<Server_Card *> cardsToReveal; if (cmd->getCardId() == -1) cardsToReveal = zone->cards; else if (cmd->getCardId() == -2) { if (zone->cards.isEmpty()) return RespContextError; cardsToReveal.append(zone->cards.at(rng->getNumber(0, zone->cards.size() - 1))); } else { Server_Card *card = zone->getCard(cmd->getCardId(), false); if (!card) return RespNameNotFound; cardsToReveal.append(card); } QList<ServerInfo_Card *> respCardListPrivate, respCardListOmniscient; for (int i = 0; i < cardsToReveal.size(); ++i) { Server_Card *card = cardsToReveal[i]; QList<ServerInfo_CardCounter *> cardCounterListPrivate, cardCounterListOmniscient; QMapIterator<int, int> cardCounterIterator(card->getCounters()); while (cardCounterIterator.hasNext()) { cardCounterIterator.next(); cardCounterListPrivate.append(new ServerInfo_CardCounter(cardCounterIterator.key(), cardCounterIterator.value())); cardCounterListOmniscient.append(new ServerInfo_CardCounter(cardCounterIterator.key(), cardCounterIterator.value())); } int attachPlayerId = -1; QString attachZone; int attachCardId = -1; if (card->getParentCard()) { attachPlayerId = card->getParentCard()->getZone()->getPlayer()->getPlayerId(); attachZone = card->getParentCard()->getZone()->getName(); attachCardId = card->getParentCard()->getId(); } if (cmd->getPlayerId() != -1) respCardListPrivate.append(new ServerInfo_Card(card->getId(), card->getName(), card->getX(), card->getY(), card->getTapped(), card->getAttacking(), card->getColor(), card->getPT(), card->getAnnotation(), card->getDestroyOnZoneChange(), cardCounterListPrivate, attachPlayerId, attachZone, attachCardId)); respCardListOmniscient.append(new ServerInfo_Card(card->getId(), card->getName(), card->getX(), card->getY(), card->getTapped(), card->getAttacking(), card->getColor(), card->getPT(), card->getAnnotation(), card->getDestroyOnZoneChange(), cardCounterListOmniscient, attachPlayerId, attachZone, attachCardId)); } if (cmd->getPlayerId() == -1) cont->enqueueGameEventPublic(new Event_RevealCards(player->getPlayerId(), zone->getName(), cmd->getCardId(), -1, respCardListOmniscient), game->getGameId()); else { cont->enqueueGameEventPublic(new Event_RevealCards(player->getPlayerId(), zone->getName(), cmd->getCardId(), otherPlayer->getPlayerId()), game->getGameId()); cont->enqueueGameEventPrivate(new Event_RevealCards(player->getPlayerId(), zone->getName(), cmd->getCardId(), otherPlayer->getPlayerId(), respCardListPrivate), game->getGameId(), otherPlayer->getPlayerId()); cont->enqueueGameEventOmniscient(new Event_RevealCards(player->getPlayerId(), zone->getName(), cmd->getCardId(), otherPlayer->getPlayerId(), respCardListOmniscient), game->getGameId()); } return RespOk; }