diff --git a/common/server_game.h b/common/server_game.h index 3cfbf542..50456cd0 100644 --- a/common/server_game.h +++ b/common/server_game.h @@ -54,7 +54,7 @@ public: bool getGameStarted() const { return gameStarted; } int getPlayerCount() const; int getSpectatorCount() const; - QList getPlayers() const { return players.values(); } + const QMap &getPlayers() const { return players; } Server_Player *getPlayer(int playerId) const { return players.value(playerId, 0); } int getGameId() const { return gameId; } QString getDescription() const { return description; } diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 133dfba0..b4e5dc02 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -208,7 +208,7 @@ ResponseCode Server_ProtocolHandler::cmdLogin(Command_Login *cmd, CommandContain // This might not scale very well. Use an extra QMap if it becomes a problem. const QList &serverGames = server->getGames(); for (int i = 0; i < serverGames.size(); ++i) { - const QList &gamePlayers = serverGames[i]->getPlayers(); + const QList &gamePlayers = serverGames[i]->getPlayers().values(); for (int j = 0; j < gamePlayers.size(); ++j) if (gamePlayers[j]->getPlayerName() == playerName) { gamePlayers[j]->setProtocolHandler(this); @@ -530,7 +530,7 @@ ResponseCode Server_ProtocolHandler::moveCard(Server_Game *game, Server_Player * // If the card was moved to another zone, delete all arrows from and to the card if (startzone != targetzone) { - const QList &players = game->getPlayers(); + const QList &players = game->getPlayers().values(); for (int i = 0; i < players.size(); ++i) { QList arrowsToDelete; QMapIterator arrowIterator(players[i]->getArrows()); @@ -709,11 +709,19 @@ ResponseCode Server_ProtocolHandler::cmdNextTurn(Command_NextTurn * /*cmd*/, Com { if (!game->getGameStarted()) return RespGameNotStarted; - + + const QMap &players = game->getPlayers(); + const QList keys = players.keys(); + int activePlayer = game->getActivePlayer(); - if (++activePlayer == game->getPlayerCount()) - activePlayer = 0; - game->setActivePlayer(activePlayer); + int listPos = keys.indexOf(activePlayer); + do { + ++listPos; + if (listPos == keys.size()) + listPos = 0; + } while (players.value(keys[listPos])->getSpectator()); + + game->setActivePlayer(keys[listPos]); return RespOk; }