From a1c46b8c9ba4c51bbc2ceba9dd23121bde64283d Mon Sep 17 00:00:00 2001 From: Kieran Kihn <114803508+kierankihn@users.noreply.github.com> Date: Sun, 7 Dec 2025 19:03:45 +0800 Subject: [PATCH] refactor(server): enhance turn validation and game state handling - Added `ServerGameStage` check in turn validation logic. - Switched to `ClientPlayerState` in `handleStartGame` for player initialization. - Integrated `endGame` in `handleEndGame` and removed redundant `reset` call. --- src/server/UnoServer.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/server/UnoServer.cpp b/src/server/UnoServer.cpp index ff73048..d80c41d 100644 --- a/src/server/UnoServer.cpp +++ b/src/server/UnoServer.cpp @@ -45,8 +45,9 @@ namespace UNO::SERVER { || playerMessage.getMessagePayloadType() == NETWORK::MessagePayloadType::END_GAME) { throw std::invalid_argument("Invalid message payload type from client"); } - if (this->networkIdToGameId.at(playerId) - != this->serverGameState_.getCurrentPlayer() - this->serverGameState_.getPlayers().begin()) { + if (this->serverGameState_.getServerGameStage() == GAME::ServerGameStage::IN_GAME + && this->networkIdToGameId.at(playerId) + != this->serverGameState_.getCurrentPlayer() - this->serverGameState_.getPlayers().begin()) { throw std::invalid_argument("Invalid player message: not this player's turn"); } if (playerMessage.getMessagePayloadType() == NETWORK::MessagePayloadType::DRAW_CARD) { @@ -61,10 +62,10 @@ namespace UNO::SERVER { void UnoServer::handleStartGame() { serverGameState_.init(); - std::vector players; + std::vector players; players.reserve(serverGameState_.getPlayers().size()); for (const auto &player : serverGameState_.getPlayers()) { - players.push_back({player.getName(), player.getRemainingCardCount(), player.getIsUno()}); + players.emplace_back(player.getName(), player.getRemainingCardCount(), player.getIsUno()); } size_t currentPlayerIndex = static_cast(serverGameState_.getCurrentPlayer() - serverGameState_.getPlayers().begin()); for (size_t i = 0; i < playerCount; i++) { @@ -120,6 +121,8 @@ namespace UNO::SERVER { void UnoServer::handleEndGame() { + this->serverGameState_.endGame(); + NETWORK::EndGamePayload payload{}; auto message = NETWORK::MessageSerializer::serialize({NETWORK::MessageStatus::OK, NETWORK::MessagePayloadType::END_GAME, payload}); @@ -127,8 +130,6 @@ namespace UNO::SERVER { this->networkServer_.send(gameIdToNetworkId.at(i), message); } - this->serverGameState_.reset(); - for (size_t i = 0; i < playerCount; i++) { this->isReadyToStart[i] = false; }