diff --git a/common/server_arrow.h b/common/server_arrow.h index 305a97f8..e87ce3fe 100644 --- a/common/server_arrow.h +++ b/common/server_arrow.h @@ -25,10 +25,18 @@ public: { return startCard; } + void setStartCard(Server_Card *startCard_) + { + startCard = startCard_; + } Server_ArrowTarget *getTargetItem() const { return targetItem; } + void setTargetItem(Server_ArrowTarget *targetItem_) + { + targetItem = targetItem_; + } const color &getColor() const { return arrowColor; diff --git a/common/server_player.cpp b/common/server_player.cpp index d10cfc60..9c21d7f8 100644 --- a/common/server_player.cpp +++ b/common/server_player.cpp @@ -1475,6 +1475,47 @@ Server_Player::cmdCreateToken(const Command_CreateToken &cmd, ResponseContainer attachedCard->getZone()->getPlayer()->getPlayerId()); } + // Copy Arrows + const QList &players = game->getPlayers().values(); + for (auto player : players) { + QMapIterator arrowIterator(player->getArrows()); + while (arrowIterator.hasNext()) { + Server_Arrow *arrow = arrowIterator.next().value(); + bool sendGameEvent = false; + const auto *startCard = arrow->getStartCard(); + if (startCard == targetCard) { + sendGameEvent = true; + arrow->setStartCard(card); + startCard = card; + } + const auto *targetItem = arrow->getTargetItem(); + if (targetItem == targetCard) { + sendGameEvent = true; + arrow->setTargetItem(card); + targetItem = card; + } + if (sendGameEvent) { + Event_CreateArrow event; + ServerInfo_Arrow *arrowInfo = event.mutable_arrow_info(); + arrowInfo->set_id(arrow->getId()); + arrowInfo->set_start_player_id(player->getPlayerId()); + arrowInfo->set_start_zone(startCard->getZone()->getName().toStdString()); + arrowInfo->set_start_card_id(startCard->getId()); + const Server_Player *arrowTargetPlayer = qobject_cast(targetItem); + if (arrowTargetPlayer != nullptr) { + arrowInfo->set_target_player_id(arrowTargetPlayer->getPlayerId()); + } else { + const Server_Card *arrowTargetCard = qobject_cast(targetItem); + arrowInfo->set_target_player_id(arrowTargetCard->getZone()->getPlayer()->getPlayerId()); + arrowInfo->set_target_zone(arrowTargetCard->getZone()->getName().toStdString()); + arrowInfo->set_target_card_id(arrowTargetCard->getId()); + } + arrowInfo->mutable_arrow_color()->CopyFrom(arrow->getColor()); + ges.enqueueGameEvent(event, player->getPlayerId()); + } + } + } + targetCard->resetState(); card->setStashedCard(targetCard); break;