diff --git a/src/client/PlayerAction.h b/src/client/PlayerAction.h index 4e4ba58..fdf3b35 100644 --- a/src/client/PlayerAction.h +++ b/src/client/PlayerAction.h @@ -22,7 +22,8 @@ namespace UNO::CLIENT { struct PlayerStartGamePayload {}; struct PlayerPlayCardPayload { - GAME::Card card; + size_t id; + GAME::CardColor color; }; struct PlayerDrawCardPayload {}; diff --git a/src/client/UnoClient.cpp b/src/client/UnoClient.cpp index 81f066e..b70e5ef 100644 --- a/src/client/UnoClient.cpp +++ b/src/client/UnoClient.cpp @@ -107,8 +107,22 @@ namespace UNO::CLIENT { void UnoClient::handlePlayerPlayCard(PlayerPlayCardPayload payload) { - NETWORK::PlayCardPayload messagePayload = {payload.card}; - NETWORK::Message message = {NETWORK::MessageStatus::OK, NETWORK::MessagePayloadType::PLAY_CARD, messagePayload}; + auto cards = this->clientGameState_->getCards(); + auto card = cards.begin(); + for (size_t i = 0; i < payload.id; i++) { + card = std::next(card); + } + + if ((card->getType() == GAME::CardType::WILD || card->getType() == GAME::CardType::WILDDRAWFOUR) + && card->getColor() != GAME::CardColor::RED) { + throw std::invalid_argument("Invalid card played by player"); + } + + NETWORK::PlayCardPayload messagePayload = { + {(card->getType() != GAME::CardType::WILD && card->getType() != GAME::CardType::WILDDRAWFOUR) ? card->getColor() + : payload.color, + card->getType()}}; + NETWORK::Message message = {NETWORK::MessageStatus::OK, NETWORK::MessagePayloadType::PLAY_CARD, messagePayload}; networkClient_->send(NETWORK::MessageSerializer::serialize(message)); }