void Server_Game::removeArrowsRelatedToPlayer(GameEventStorage &ges, Server_Player *player) { QMutexLocker locker(&gameMutex); // Remove all arrows of other players pointing to the player being removed or to one of his cards. // Also remove all arrows starting at one of his cards. This is necessary since players can create // arrows that start at another person's cards. QMapIterator<int, Server_Player *> playerIterator(players); while (playerIterator.hasNext()) { Server_Player *p = playerIterator.next().value(); QList<Server_Arrow *> arrows = p->getArrows().values(); QList<Server_Arrow *> toDelete; for (int i = 0; i < arrows.size(); ++i) { Server_Arrow *a = arrows[i]; Server_Card *targetCard = qobject_cast<Server_Card *>(a->getTargetItem()); if (targetCard) { if (targetCard->getZone()->getPlayer() == player) toDelete.append(a); } else if (static_cast<Server_Player *>(a->getTargetItem()) == player) toDelete.append(a); // Don't use else here! It has to happen regardless of whether targetCard == 0. if (a->getStartCard()->getZone()->getPlayer() == player) toDelete.append(a); } for (int i = 0; i < toDelete.size(); ++i) { Event_DeleteArrow event; event.set_arrow_id(toDelete[i]->getId()); ges.enqueueGameEvent(event, p->getPlayerId()); p->deleteArrow(toDelete[i]->getId()); } } }
ResponseCode Server_Player::setCardAttrHelper(CommandContainer *cont, const QString &zoneName, int cardId, const QString &attrName, const QString &attrValue) { Server_CardZone *zone = getZones().value(zoneName); if (!zone) return RespNameNotFound; if (!zone->hasCoords()) return RespContextError; if (cardId == -1) { QListIterator<Server_Card *> CardIterator(zone->cards); while (CardIterator.hasNext()) if (!CardIterator.next()->setAttribute(attrName, attrValue, true)) return RespInvalidCommand; } else { Server_Card *card = zone->getCard(cardId, false); if (!card) return RespNameNotFound; if (!card->setAttribute(attrName, attrValue, false)) return RespInvalidCommand; } cont->enqueueGameEventPrivate(new Event_SetCardAttr(getPlayerId(), zone->getName(), cardId, attrName, attrValue), game->getGameId()); cont->enqueueGameEventPublic(new Event_SetCardAttr(getPlayerId(), zone->getName(), cardId, attrName, attrValue), game->getGameId()); cont->enqueueGameEventOmniscient(new Event_SetCardAttr(getPlayerId(), zone->getName(), cardId, attrName, attrValue), game->getGameId()); return RespOk; }
ResponseCode Server_ProtocolHandler::cmdCreateArrow(Command_CreateArrow *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player) { if (player->getSpectator()) return RespFunctionNotAllowed; if (!game->getGameStarted()) return RespGameNotStarted; Server_Player *startPlayer = game->getPlayer(cmd->getStartPlayerId()); Server_Player *targetPlayer = game->getPlayer(cmd->getTargetPlayerId()); if (!startPlayer || !targetPlayer) return RespNameNotFound; Server_CardZone *startZone = startPlayer->getZones().value(cmd->getStartZone()); bool playerTarget = cmd->getTargetZone().isEmpty(); Server_CardZone *targetZone = 0; if (!playerTarget) targetZone = targetPlayer->getZones().value(cmd->getTargetZone()); if (!startZone || (!targetZone && !playerTarget)) return RespNameNotFound; if (startZone->getType() != PublicZone) return RespContextError; Server_Card *startCard = startZone->getCard(cmd->getStartCardId(), false); if (!startCard) return RespNameNotFound; Server_Card *targetCard = 0; if (!playerTarget) { if (targetZone->getType() != PublicZone) return RespContextError; targetCard = targetZone->getCard(cmd->getTargetCardId(), false); } Server_ArrowTarget *targetItem; if (playerTarget) targetItem = targetPlayer; else targetItem = targetCard; if (!targetItem) return RespNameNotFound; QMapIterator<int, Server_Arrow *> arrowIterator(player->getArrows()); while (arrowIterator.hasNext()) { Server_Arrow *temp = arrowIterator.next().value(); if ((temp->getStartCard() == startCard) && (temp->getTargetItem() == targetItem)) return RespContextError; } Server_Arrow *arrow = new Server_Arrow(player->newArrowId(), startCard, targetItem, cmd->getColor()); player->addArrow(arrow); game->sendGameEvent(new Event_CreateArrows(player->getPlayerId(), QList<ServerInfo_Arrow *>() << new ServerInfo_Arrow( arrow->getId(), startPlayer->getPlayerId(), startZone->getName(), startCard->getId(), targetPlayer->getPlayerId(), cmd->getTargetZone(), cmd->getTargetCardId(), cmd->getColor() ))); return RespOk; }
ResponseCode Server_ProtocolHandler::cmdIncCardCounter(Command_IncCardCounter *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player) { if (player->getSpectator()) return RespFunctionNotAllowed; if (!game->getGameStarted()) return RespGameNotStarted; Server_CardZone *zone = player->getZones().value(cmd->getZone()); if (!zone) return RespNameNotFound; if (!zone->hasCoords()) return RespContextError; Server_Card *card = zone->getCard(cmd->getCardId(), false); if (!card) return RespNameNotFound; int newValue = card->getCounter(cmd->getCounterId()) + cmd->getCounterDelta(); card->setCounter(cmd->getCounterId(), newValue); cont->enqueueGameEventPrivate(new Event_SetCardCounter(player->getPlayerId(), zone->getName(), card->getId(), cmd->getCounterId(), newValue), game->getGameId()); cont->enqueueGameEventPublic(new Event_SetCardCounter(player->getPlayerId(), zone->getName(), card->getId(), cmd->getCounterId(), newValue), game->getGameId()); return RespOk; }
ResponseCode Server_ProtocolHandler::cmdFlipCard(Command_FlipCard *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player) { if (player->getSpectator()) return RespFunctionNotAllowed; if (!game->getGameStarted()) return RespGameNotStarted; Server_CardZone *zone = player->getZones().value(cmd->getZone()); if (!zone) return RespNameNotFound; if (!zone->hasCoords()) return RespContextError; Server_Card *card = zone->getCard(cmd->getCardId(), false); if (!card) return RespNameNotFound; const bool faceDown = cmd->getFaceDown(); if (faceDown == card->getFaceDown()) return RespContextError; card->setFaceDown(faceDown); cont->enqueueGameEventPrivate(new Event_FlipCard(player->getPlayerId(), zone->getName(), card->getId(), card->getName(), faceDown), game->getGameId()); cont->enqueueGameEventPublic(new Event_FlipCard(player->getPlayerId(), zone->getName(), card->getId(), card->getName(), faceDown), game->getGameId()); return RespOk; }
ResponseCode Server_ProtocolHandler::drawCards(Server_Game *game, Server_Player *player, CommandContainer *cont, int number) { if (player->getSpectator()) return RespFunctionNotAllowed; if (!game->getGameStarted()) return RespGameNotStarted; Server_CardZone *deck = player->getZones().value("deck"); Server_CardZone *hand = player->getZones().value("hand"); if (deck->cards.size() < number) number = deck->cards.size(); QList<ServerInfo_Card *> cardListPrivate; QList<ServerInfo_Card *> cardListOmniscient; for (int i = 0; i < number; ++i) { Server_Card *card = deck->cards.takeFirst(); hand->cards.append(card); cardListPrivate.append(new ServerInfo_Card(card->getId(), card->getName())); cardListOmniscient.append(new ServerInfo_Card(card->getId(), card->getName())); } cont->enqueueGameEventPrivate(new Event_DrawCards(player->getPlayerId(), cardListPrivate.size(), cardListPrivate), game->getGameId()); cont->enqueueGameEventOmniscient(new Event_DrawCards(player->getPlayerId(), cardListOmniscient.size(), cardListOmniscient), game->getGameId()); cont->enqueueGameEventPublic(new Event_DrawCards(player->getPlayerId(), cardListPrivate.size()), game->getGameId()); return RespOk; }
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_Arrow::getInfo(ServerInfo_Arrow *info) { info->set_id(id); info->set_start_player_id(startCard->getZone()->getPlayer()->getPlayerId()); info->set_start_zone(startCard->getZone()->getName().toStdString()); info->set_start_card_id(startCard->getId()); info->mutable_arrow_color()->CopyFrom(arrowColor); Server_Card *targetCard = qobject_cast<Server_Card *>(targetItem); if (targetCard) { info->set_target_player_id(targetCard->getZone()->getPlayer()->getPlayerId()); info->set_target_zone(targetCard->getZone()->getName().toStdString()); info->set_target_card_id(targetCard->getId()); } else info->set_target_player_id(static_cast<Server_Player *>(targetItem)->getPlayerId()); }
void Server_Game::unattachCards(GameEventStorage &ges, Server_Player *player) { QMutexLocker locker(&gameMutex); QMapIterator<QString, Server_CardZone *> zoneIterator(player->getZones()); while (zoneIterator.hasNext()) { Server_CardZone *zone = zoneIterator.next().value(); for (int i = 0; i < zone->getCards().size(); ++i) { Server_Card *card = zone->getCards().at(i); // Make a copy of the list because the original one gets modified during the loop QList<Server_Card *> attachedCards = card->getAttachedCards(); for (int i = 0; i < attachedCards.size(); ++i) attachedCards[i]->getZone()->getPlayer()->unattachCard(ges, attachedCards[i]); } } }
ResponseCode Server_ProtocolHandler::cmdCreateToken(Command_CreateToken *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player) { if (player->getSpectator()) return RespFunctionNotAllowed; if (!game->getGameStarted()) return RespGameNotStarted; Server_CardZone *zone = player->getZones().value(cmd->getZone()); if (!zone) return RespNameNotFound; int x = cmd->getX(); int y = cmd->getY(); if (zone->hasCoords()) x = zone->getFreeGridColumn(x, y, cmd->getCardName()); if (x < 0) x = 0; if (y < 0) y = 0; Server_Card *card = new Server_Card(cmd->getCardName(), player->newCardId(), x, y); card->setPT(cmd->getPt()); card->setColor(cmd->getColor()); card->setAnnotation(cmd->getAnnotation()); card->setDestroyOnZoneChange(cmd->getDestroy()); zone->insertCard(card, x, y); game->sendGameEvent(new Event_CreateToken(player->getPlayerId(), zone->getName(), card->getId(), card->getName(), cmd->getColor(), cmd->getPt(), cmd->getAnnotation(), cmd->getDestroy(), x, y)); return RespOk; }
ResponseCode Server_Player::moveCard(CommandContainer *cont, Server_CardZone *startzone, const QList<int> &_cardIds, Server_CardZone *targetzone, int x, int y, bool faceDown, bool tapped) { // Disallow controller change to other zones than the table. if (((targetzone->getType() != PublicZone) || !targetzone->hasCoords()) && (startzone->getPlayer() != targetzone->getPlayer())) return RespContextError; if (!targetzone->hasCoords() && (x == -1)) x = targetzone->cards.size(); QList<QPair<Server_Card *, int> > cardsToMove; for (int i = 0; i < _cardIds.size(); ++i) { int position; Server_Card *card = startzone->getCard(_cardIds[i], false, &position); if (!card) return RespNameNotFound; if (!card->getAttachedCards().isEmpty() && !targetzone->isColumnEmpty(x, y)) return RespContextError; cardsToMove.append(QPair<Server_Card *, int>(card, position)); } MoveCardCompareFunctor cmp(startzone == targetzone ? -1 : x); qSort(cardsToMove.begin(), cardsToMove.end(), cmp); bool secondHalf = false; int xIndex = -1; for (int cardIndex = 0; cardIndex < cardsToMove.size(); ++cardIndex) { Server_Card *card = cardsToMove[cardIndex].first; int originalPosition = cardsToMove[cardIndex].second; int position = startzone->removeCard(card); if ((startzone == targetzone) && !startzone->hasCoords()) { if (!secondHalf && (originalPosition < x)) { xIndex = -1; secondHalf = true; } else if (secondHalf) --xIndex; else ++xIndex; } else ++xIndex; int newX = x + xIndex; // Attachment relationships can be retained when moving a card onto the opponent's table if (startzone->getName() != targetzone->getName()) { // Delete all attachment relationships if (card->getParentCard()) card->setParentCard(0); // Make a copy of the list because the original one gets modified during the loop QList<Server_Card *> attachedCards = card->getAttachedCards(); for (int i = 0; i < attachedCards.size(); ++i) attachedCards[i]->getZone()->getPlayer()->unattachCard(cont, attachedCards[i]); } if (startzone != targetzone) { // Delete all arrows from and to the card const QList<Server_Player *> &players = game->getPlayers().values(); for (int i = 0; i < players.size(); ++i) { QList<int> arrowsToDelete; QMapIterator<int, Server_Arrow *> arrowIterator(players[i]->getArrows()); while (arrowIterator.hasNext()) { Server_Arrow *arrow = arrowIterator.next().value(); if ((arrow->getStartCard() == card) || (arrow->getTargetItem() == card)) arrowsToDelete.append(arrow->getId()); } for (int j = 0; j < arrowsToDelete.size(); ++j) players[i]->deleteArrow(arrowsToDelete[j]); } } if (card->getDestroyOnZoneChange() && (startzone != targetzone)) { cont->enqueueGameEventPrivate(new Event_DestroyCard(getPlayerId(), startzone->getName(), card->getId()), game->getGameId()); cont->enqueueGameEventPublic(new Event_DestroyCard(getPlayerId(), startzone->getName(), card->getId()), game->getGameId()); card->deleteLater(); } else { if (!targetzone->hasCoords()) { y = 0; card->resetState(); } else newX = targetzone->getFreeGridColumn(newX, y, card->getName()); targetzone->insertCard(card, newX, y); bool targetBeingLookedAt = (targetzone->getType() != HiddenZone) || (targetzone->getCardsBeingLookedAt() > newX) || (targetzone->getCardsBeingLookedAt() == -1); bool sourceBeingLookedAt = (startzone->getType() != HiddenZone) || (startzone->getCardsBeingLookedAt() > position) || (startzone->getCardsBeingLookedAt() == -1); bool targetHiddenToPlayer = faceDown || !targetBeingLookedAt; bool targetHiddenToOthers = faceDown || (targetzone->getType() != PublicZone); bool sourceHiddenToPlayer = card->getFaceDown() || !sourceBeingLookedAt; bool sourceHiddenToOthers = card->getFaceDown() || (startzone->getType() != PublicZone); QString privateCardName, publicCardName; if (!(sourceHiddenToPlayer && targetHiddenToPlayer)) privateCardName = card->getName(); if (!(sourceHiddenToOthers && targetHiddenToOthers)) publicCardName = card->getName(); int oldCardId = card->getId(); if (faceDown) card->setId(newCardId()); card->setFaceDown(faceDown); // The player does not get to see which card he moved if it moves between two parts of hidden zones which // are not being looked at. int privateNewCardId = card->getId(); int privateOldCardId = oldCardId; if (!targetBeingLookedAt && !sourceBeingLookedAt) { privateOldCardId = -1; privateNewCardId = -1; privateCardName = QString(); } int privatePosition = -1; if (startzone->getType() == HiddenZone) privatePosition = position; cont->enqueueGameEventPrivate(new Event_MoveCard(getPlayerId(), privateOldCardId, privateCardName, startzone->getName(), privatePosition, targetzone->getPlayer()->getPlayerId(), targetzone->getName(), newX, y, privateNewCardId, faceDown), game->getGameId()); cont->enqueueGameEventOmniscient(new Event_MoveCard(getPlayerId(), privateOldCardId, privateCardName, startzone->getName(), privatePosition, targetzone->getPlayer()->getPlayerId(), targetzone->getName(), newX, y, privateNewCardId, faceDown), game->getGameId()); // Other players do not get to see the start and/or target position of the card if the respective // part of the zone is being looked at. The information is not needed anyway because in hidden zones, // all cards are equal. if ( ((startzone->getType() == HiddenZone) && ((startzone->getCardsBeingLookedAt() > position) || (startzone->getCardsBeingLookedAt() == -1))) || (startzone->getType() == PublicZone) ) position = -1; if ((targetzone->getType() == HiddenZone) && ((targetzone->getCardsBeingLookedAt() > newX) || (targetzone->getCardsBeingLookedAt() == -1))) newX = -1; if ((startzone->getType() == PublicZone) || (targetzone->getType() == PublicZone)) cont->enqueueGameEventPublic(new Event_MoveCard(getPlayerId(), oldCardId, publicCardName, startzone->getName(), position, targetzone->getPlayer()->getPlayerId(), targetzone->getName(), newX, y, card->getId(), faceDown), game->getGameId()); else cont->enqueueGameEventPublic(new Event_MoveCard(getPlayerId(), -1, QString(), startzone->getName(), position, targetzone->getPlayer()->getPlayerId(), targetzone->getName(), newX, y, -1, false), game->getGameId()); if (tapped) setCardAttrHelper(cont, targetzone->getName(), card->getId(), "tapped", "1"); } } if (startzone->hasCoords()) startzone->fixFreeSpaces(cont); return RespOk; }
ResponseCode Server_ProtocolHandler::cmdAttachCard(Command_AttachCard *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player) { if (player->getSpectator()) return RespFunctionNotAllowed; if (!game->getGameStarted()) return RespGameNotStarted; Server_CardZone *startzone = player->getZones().value(cmd->getStartZone()); if (!startzone) return RespNameNotFound; Server_Card *card = startzone->getCard(cmd->getCardId(), false); if (!card) return RespNameNotFound; int playerId = cmd->getTargetPlayerId(); Server_Player *targetPlayer = 0; Server_CardZone *targetzone = 0; Server_Card *targetCard = 0; if (playerId != -1) { targetPlayer = game->getPlayer(cmd->getTargetPlayerId()); if (!targetPlayer) return RespNameNotFound; } else if (!card->getParentCard()) return RespContextError; if (targetPlayer) targetzone = targetPlayer->getZones().value(cmd->getTargetZone()); if (targetzone) { // This is currently enough to make sure cards don't get attached to a card that is not on the table. // Possibly a flag will have to be introduced for this sometime. if (!targetzone->hasCoords()) return RespContextError; targetCard = targetzone->getCard(cmd->getTargetCardId(), false); if (targetCard) if (targetCard->getParentCard()) return RespContextError; } if (!startzone->hasCoords()) return RespContextError; // Get all arrows pointing to or originating from the card being attached and delete them. QMapIterator<int, Server_Player *> playerIterator(game->getPlayers()); while (playerIterator.hasNext()) { Server_Player *p = playerIterator.next().value(); QList<Server_Arrow *> arrows = p->getArrows().values(); QList<Server_Arrow *> toDelete; for (int i = 0; i < arrows.size(); ++i) { Server_Arrow *a = arrows[i]; Server_Card *tCard = qobject_cast<Server_Card *>(a->getTargetItem()); if ((tCard == card) || (a->getStartCard() == card)) toDelete.append(a); } for (int i = 0; i < toDelete.size(); ++i) { cont->enqueueGameEventPrivate(new Event_DeleteArrow(p->getPlayerId(), toDelete[i]->getId()), game->getGameId()); cont->enqueueGameEventPublic(new Event_DeleteArrow(p->getPlayerId(), toDelete[i]->getId()), game->getGameId()); p->deleteArrow(toDelete[i]->getId()); } } if (targetCard) { // Unattach all cards attached to the card being attached. const QList<Server_Card *> &attachedList = card->getAttachedCards(); for (int i = 0; i < attachedList.size(); ++i) player->unattachCard(cont, attachedList[i]); if (targetzone->isColumnStacked(targetCard->getX(), targetCard->getY())) targetPlayer->moveCard(cont, targetzone, QList<int>() << targetCard->getId(), targetzone, targetzone->getFreeGridColumn(-2, targetCard->getY(), targetCard->getName()), targetCard->getY(), targetCard->getFaceDown(), false); card->setParentCard(targetCard); card->setCoords(-1, card->getY()); cont->enqueueGameEventPrivate(new Event_AttachCard(player->getPlayerId(), startzone->getName(), card->getId(), targetPlayer->getPlayerId(), targetzone->getName(), targetCard->getId()), game->getGameId()); cont->enqueueGameEventPublic(new Event_AttachCard(player->getPlayerId(), startzone->getName(), card->getId(), targetPlayer->getPlayerId(), targetzone->getName(), targetCard->getId()), game->getGameId()); } else player->unattachCard(cont, card); return RespOk; }
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; }