diff --git a/src/net/common/servergame.cpp b/src/net/common/servergame.cpp index 5c63e89e..801a44f2 100644 --- a/src/net/common/servergame.cpp +++ b/src/net/common/servergame.cpp @@ -295,6 +295,44 @@ ServerGame::InitRankingMap(const PlayerDataList &playerDataList) } } +void +ServerGame::UpdateRankingMap() +{ + list > activePlayers = *m_game->getActivePlayerList(); + size_t currentRank = activePlayers.size(); + list > tmpRemovedPlayers; + PlayerListIterator active_i = activePlayers.begin(); + PlayerListIterator active_end = activePlayers.end(); + PlayerListIterator next_i = active_i; + while(active_i != active_end) + { + ++next_i; + if ((*active_i)->getMyCash() < 1) + { + tmpRemovedPlayers.push_back(*active_i); + activePlayers.erase(active_i); + } + active_i = next_i; + } + + if (!tmpRemovedPlayers.empty()) + { + currentRank = currentRank - tmpRemovedPlayers.size() + 1; + PlayerListConstIterator removed_i = tmpRemovedPlayers.begin(); + PlayerListConstIterator removed_end = tmpRemovedPlayers.end(); + while (removed_i != removed_end) + { + SetPlayerPlace((*removed_i)->getMyUniqueID(), currentRank); + ++removed_i; + } + } + // Last player is winner. + if (activePlayers.size() == 1) + { + SetPlayerPlace((*(activePlayers.begin()))->getMyUniqueID(), 1); + } +} + void ServerGame::SetPlayerPlace(unsigned playerId, int place) { @@ -736,7 +774,7 @@ void ServerGame::RemoveDisconnectedPlayers() { // This should only be called between hands. - if (m_game.get()) + if (m_game) { PlayerListIterator i = m_game->getSeatsList()->begin(); PlayerListIterator end = m_game->getSeatsList()->end(); diff --git a/src/net/common/servergamestate.cpp b/src/net/common/servergamestate.cpp index b40b3431..5f07bb46 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -919,6 +919,9 @@ ServerGameStateHand::EngineLoop(boost::shared_ptr server) // Remove disconnected players. This is the one and only place to do this. server->RemoveDisconnectedPlayers(); + // Update rankings of all remaining players. + server->UpdateRankingMap(); + // Start next hand - if enough players are left. list > playersWithCash = *curGame.getActivePlayerList(); playersWithCash.remove_if(boost::bind(&PlayerInterface::getMyCash, _1) < 1); @@ -931,7 +934,6 @@ ServerGameStateHand::EngineLoop(boost::shared_ptr server) else if (playersWithCash.size() == 1) { boost::shared_ptr winnerPlayer = *(playersWithCash.begin()); - server->SetPlayerPlace(winnerPlayer->getMyUniqueID(), 1); server->InternalEndGame(); // View a dialog for a new game - delayed. diff --git a/src/net/servergame.h b/src/net/servergame.h index 1fd04465..2834aa29 100644 --- a/src/net/servergame.h +++ b/src/net/servergame.h @@ -65,7 +65,7 @@ public: void SendToAllPlayers(boost::shared_ptr packet, SessionData::State state); void SendToAllButOnePlayers(boost::shared_ptr packet, SessionId except, SessionData::State state); - void RemoveAllSessions(); + void RemoveAllSessions(); bool IsPasswordProtected() const; bool CheckPassword(const std::string &password) const; @@ -106,6 +106,7 @@ protected: void InternalStartGame(); void InitRankingMap(const PlayerDataList &playerDataList); + void UpdateRankingMap(); void SetPlayerPlace(unsigned playerId, int place); void InternalEndGame();