mirror of
https://github.com/kierankihn/uno-game.git
synced 2025-12-27 02:13:18 +08:00
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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user