From 3ff38b84a2c89ab178d1976d4a8784c311d6b6d5 Mon Sep 17 00:00:00 2001 From: nordsoft Date: Wed, 5 Oct 2022 01:54:31 +0400 Subject: [PATCH] Support hotseat over multiplier --- client/NetPacksClient.cpp | 37 ++++++++++++++++++++----------------- lib/NetPacks.h | 4 ++-- lib/NetPacksLib.cpp | 5 ++++- server/CVCMIServer.cpp | 24 ++++++++++++++---------- 4 files changed, 40 insertions(+), 30 deletions(-) diff --git a/client/NetPacksClient.cpp b/client/NetPacksClient.cpp index 9a15fc937..46fb54a86 100644 --- a/client/NetPacksClient.cpp +++ b/client/NetPacksClient.cpp @@ -347,24 +347,27 @@ void PlayerEndsGame::applyCl(CClient *cl) void PlayerReinitInterface::applyCl(CClient * cl) { - auto & plSettings = CSH->si->getIthPlayersSettings(player); - if(playerConnectionId == PlayerSettings::PLAYER_AI) + for(auto player : players) { - plSettings.connectedPlayerIDs.clear(); - cl->initPlayerEnvironments(); - cl->initPlayerInterfaces(); - auto currentPlayer = cl->gameState()->currentPlayer; - callAllInterfaces(cl, &IGameEventsReceiver::playerStartsTurn, currentPlayer); - callOnlyThatInterface(cl, currentPlayer, &CGameInterface::yourTurn); - } - else if(playerConnectionId == CSH->c->connectionID) - { - plSettings.connectedPlayerIDs.insert(playerConnectionId); - cl->playerint.clear(); - cl->initPlayerInterfaces(); - auto currentPlayer = cl->gameState()->currentPlayer; - callAllInterfaces(cl, &IGameEventsReceiver::playerStartsTurn, currentPlayer); - callOnlyThatInterface(cl, currentPlayer, &CGameInterface::yourTurn); + auto & plSettings = CSH->si->getIthPlayersSettings(player); + if(playerConnectionId == PlayerSettings::PLAYER_AI) + { + plSettings.connectedPlayerIDs.clear(); + cl->initPlayerEnvironments(); + cl->initPlayerInterfaces(); + auto currentPlayer = cl->gameState()->currentPlayer; + callAllInterfaces(cl, &IGameEventsReceiver::playerStartsTurn, currentPlayer); + callOnlyThatInterface(cl, currentPlayer, &CGameInterface::yourTurn); + } + else if(playerConnectionId == CSH->c->connectionID) + { + plSettings.connectedPlayerIDs.insert(playerConnectionId); + cl->playerint.clear(); + cl->initPlayerInterfaces(); + auto currentPlayer = cl->gameState()->currentPlayer; + callAllInterfaces(cl, &IGameEventsReceiver::playerStartsTurn, currentPlayer); + callOnlyThatInterface(cl, currentPlayer, &CGameInterface::yourTurn); + } } } diff --git a/lib/NetPacks.h b/lib/NetPacks.h index 61031d27a..8ec913ff9 100644 --- a/lib/NetPacks.h +++ b/lib/NetPacks.h @@ -426,12 +426,12 @@ struct PlayerReinitInterface : public CPackForClient void applyCl(CClient * cl); DLL_LINKAGE void applyGs(CGameState *gs); - PlayerColor player; + std::vector players; ui8 playerConnectionId; //PLAYER_AI fro AI player template void serialize(Handler &h, const int version) { - h & player; + h & players; h & playerConnectionId; } }; diff --git a/lib/NetPacksLib.cpp b/lib/NetPacksLib.cpp index 1e9645785..6339d77ee 100644 --- a/lib/NetPacksLib.cpp +++ b/lib/NetPacksLib.cpp @@ -372,7 +372,10 @@ DLL_LINKAGE void PlayerReinitInterface::applyGs(CGameState *gs) //TODO: what does mean if more that one player connected? if(playerConnectionId == PlayerSettings::PLAYER_AI) - gs->scenarioOps->getIthPlayersSettings(player).connectedPlayerIDs.clear(); + { + for(auto player : players) + gs->scenarioOps->getIthPlayersSettings(player).connectedPlayerIDs.clear(); + } } DLL_LINKAGE void RemoveBonus::applyGs(CGameState *gs) diff --git a/server/CVCMIServer.cpp b/server/CVCMIServer.cpp index 0e166738e..9d83bf664 100644 --- a/server/CVCMIServer.cpp +++ b/server/CVCMIServer.cpp @@ -507,6 +507,9 @@ void CVCMIServer::clientDisconnected(std::shared_ptr c) return; } + PlayerReinitInterface startAiPack; + startAiPack.playerConnectionId = PlayerSettings::PLAYER_AI; + for(auto it = playerNames.begin(); it != playerNames.end();) { if(it->second.connection != c->connectionID) @@ -532,16 +535,19 @@ void CVCMIServer::clientDisconnected(std::shared_ptr c) { gh->playerMessage(playerSettings->color, playerLeftMsgText, ObjectInstanceID{}); gh->connections[playerSettings->color].insert(hostClient); - PlayerReinitInterface startAiPack; - startAiPack.player = playerSettings->color; - startAiPack.playerConnectionId = PlayerSettings::PLAYER_AI; - gh->sendAndApply(&startAiPack); + startAiPack.players.push_back(playerSettings->color); } } + + if(!startAiPack.players.empty()) + gh->sendAndApply(&startAiPack); } void CVCMIServer::reconnectPlayer(int connId) { + PlayerReinitInterface startAiPack; + startAiPack.playerConnectionId = connId; + if(gh && si && state == EServerState::GAMEPLAY) { for(auto it = playerNames.begin(); it != playerNames.end(); ++it) @@ -557,13 +563,11 @@ void CVCMIServer::reconnectPlayer(int connId) std::string messageText = boost::str(boost::format("%s (cid %d) is connected") % playerSettings->name % connId); gh->playerMessage(playerSettings->color, messageText, ObjectInstanceID{}); - PlayerReinitInterface startAiPack; - startAiPack.player = playerSettings->color; - startAiPack.playerConnectionId = connId; - gh->sendAndApply(&startAiPack); + startAiPack.players.push_back(playerSettings->color); } - //gh->playerMessage(playerSettings->color, playerLeftMsgText, ObjectInstanceID{}); - //gh->connections[playerSettings->color].insert(hostClient); + + if(!startAiPack.players.empty()) + gh->sendAndApply(&startAiPack); } }