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.
This commit is contained in:
Kieran Kihn
2025-12-07 19:03:45 +08:00
parent 0802d989f8
commit a1c46b8c9b

View File

@@ -45,8 +45,9 @@ namespace UNO::SERVER {
|| playerMessage.getMessagePayloadType() == NETWORK::MessagePayloadType::END_GAME) { || playerMessage.getMessagePayloadType() == NETWORK::MessagePayloadType::END_GAME) {
throw std::invalid_argument("Invalid message payload type from client"); throw std::invalid_argument("Invalid message payload type from client");
} }
if (this->networkIdToGameId.at(playerId) if (this->serverGameState_.getServerGameStage() == GAME::ServerGameStage::IN_GAME
!= this->serverGameState_.getCurrentPlayer() - this->serverGameState_.getPlayers().begin()) { && this->networkIdToGameId.at(playerId)
!= this->serverGameState_.getCurrentPlayer() - this->serverGameState_.getPlayers().begin()) {
throw std::invalid_argument("Invalid player message: not this player's turn"); throw std::invalid_argument("Invalid player message: not this player's turn");
} }
if (playerMessage.getMessagePayloadType() == NETWORK::MessagePayloadType::DRAW_CARD) { if (playerMessage.getMessagePayloadType() == NETWORK::MessagePayloadType::DRAW_CARD) {
@@ -61,10 +62,10 @@ namespace UNO::SERVER {
void UnoServer::handleStartGame() void UnoServer::handleStartGame()
{ {
serverGameState_.init(); serverGameState_.init();
std::vector<NETWORK::PlayerPublicState> players; std::vector<GAME::ClientPlayerState> players;
players.reserve(serverGameState_.getPlayers().size()); players.reserve(serverGameState_.getPlayers().size());
for (const auto &player : serverGameState_.getPlayers()) { 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<size_t>(serverGameState_.getCurrentPlayer() - serverGameState_.getPlayers().begin()); size_t currentPlayerIndex = static_cast<size_t>(serverGameState_.getCurrentPlayer() - serverGameState_.getPlayers().begin());
for (size_t i = 0; i < playerCount; i++) { for (size_t i = 0; i < playerCount; i++) {
@@ -120,6 +121,8 @@ namespace UNO::SERVER {
void UnoServer::handleEndGame() void UnoServer::handleEndGame()
{ {
this->serverGameState_.endGame();
NETWORK::EndGamePayload payload{}; NETWORK::EndGamePayload payload{};
auto message = NETWORK::MessageSerializer::serialize({NETWORK::MessageStatus::OK, NETWORK::MessagePayloadType::END_GAME, 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->networkServer_.send(gameIdToNetworkId.at(i), message);
} }
this->serverGameState_.reset();
for (size_t i = 0; i < playerCount; i++) { for (size_t i = 0; i < playerCount; i++) {
this->isReadyToStart[i] = false; this->isReadyToStart[i] = false;
} }