From 5ff38c2bdefecc1126e8b0d4c747403cccb1a23b Mon Sep 17 00:00:00 2001 From: Kieran Kihn <114803508+kierankihn@users.noreply.github.com> Date: Wed, 10 Dec 2025 21:40:37 +0800 Subject: [PATCH] feat(client): validate and handle wild card type in `handlePlayerPlayCard` - Added validation for wild card types and ensured proper color assignment. - Updated `PlayerPlayCardPayload` to use ID and color instead of card object. --- src/client/PlayerAction.h | 3 ++- src/client/UnoClient.cpp | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) 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)); }