From b965343496376bac5e65651c4d9951ccbdd6ce4c Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Sat, 9 Jun 2012 15:21:18 +0000 Subject: [PATCH] - added ability to show a user is disconnected from the game --- source/glest_game/game/commander.cpp | 33 +++++++++++++++--- source/glest_game/game/commander.h | 2 +- source/glest_game/game/game.cpp | 12 ++++--- source/glest_game/game/game_settings.h | 42 +++++++++++++++++++---- source/glest_game/network/network_types.h | 3 +- 5 files changed, 74 insertions(+), 18 deletions(-) diff --git a/source/glest_game/game/commander.cpp b/source/glest_game/game/commander.cpp index ad783db1..def02002 100644 --- a/source/glest_game/game/commander.cpp +++ b/source/glest_game/game/commander.cpp @@ -479,6 +479,11 @@ void Commander::tryResumeGame() const { pushNetworkCommand(&command); } +void Commander::tryNetworkPlayerDisconnected(int factionIndex) const { + NetworkCommand command(this->world,nctPlayerStatusChange, factionIndex, 1); + pushNetworkCommand(&command); +} + // ==================== PRIVATE ==================== CommandResult Commander::computeResult(const CommandResultContainer &results) const { @@ -801,7 +806,8 @@ void Commander::giveNetworkCommand(NetworkCommand* networkCommand) const { } break; - case nctPauseResume: { + case nctPauseResume: + { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] found nctPauseResume\n",__FILE__,__FUNCTION__,__LINE__); commandWasHandled = true; @@ -812,12 +818,29 @@ void Commander::giveNetworkCommand(NetworkCommand* networkCommand) const { //printf("nctPauseResume pauseGame = %d\n",pauseGame); game->setPaused(pauseGame,true); - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld [after unit->setMeetingPos]\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); - - if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] found nctSetMeetingPoint\n",__FILE__,__FUNCTION__,__LINE__); - } + if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] found nctPauseResume\n",__FILE__,__FUNCTION__,__LINE__); + } break; + case nctPlayerStatusChange: + { + if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] found nctPlayerStatusChange\n",__FILE__,__FUNCTION__,__LINE__); + + commandWasHandled = true; + + int factionIndex = networkCommand->getUnitId(); + int playerStatus = networkCommand->getCommandTypeId(); + + if(playerStatus == 1) { + GameSettings *settings = world->getGameSettingsPtr(); + settings->setNetworkPlayerGameStatus(factionIndex,1); + } + + + if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] found nctPlayerStatusChange\n",__FILE__,__FUNCTION__,__LINE__); + } + break; + } /* diff --git a/source/glest_game/game/commander.h b/source/glest_game/game/commander.h index 169ea9b1..7b3f6125 100644 --- a/source/glest_game/game/commander.h +++ b/source/glest_game/game/commander.h @@ -113,7 +113,7 @@ public: void trySwitchTeamVote(const Faction* faction, SwitchTeamVote *vote) const; void tryPauseGame() const; void tryResumeGame() const; - + void tryNetworkPlayerDisconnected(int factionIndex) const; Command* buildCommand(const NetworkCommand* networkCommand) const; diff --git a/source/glest_game/game/game.cpp b/source/glest_game/game/game.cpp index a87711ae..7ea7b3ce 100644 --- a/source/glest_game/game/game.cpp +++ b/source/glest_game/game/game.cpp @@ -34,6 +34,7 @@ using namespace Shared::Platform; namespace Glest{ namespace Game{ +string GameSettings::playerDisconnectedText = ""; Game *thisGamePtr = NULL; // ===================================================== @@ -838,6 +839,8 @@ void Game::init(bool initForPreviewOnly) { Map *map= world.getMap(); NetworkManager &networkManager= NetworkManager::getInstance(); + GameSettings::playerDisconnectedText = "*" + lang.get("Disconnect") + "* - "; + if(map == NULL) { throw megaglest_runtime_error("map == NULL"); } @@ -1549,7 +1552,9 @@ void Game::ReplaceDisconnectedNetworkPlayersWithAI(bool isNetworkGame, NetworkRo server->isClientConnected(faction->getStartLocationIndex()) == false) { faction->setFactionDisconnectHandled(true); - char szBuf[1024]=""; + Lang &lang= Lang::getInstance(); + + char szBuf[4096]=""; if(faction->getPersonalityType() != fpt_Observer) { faction->setControlType(ctCpu); aiInterfaces[i] = new AiInterface(*this, i, faction->getTeam(), faction->getStartLocationIndex()); @@ -1557,15 +1562,15 @@ void Game::ReplaceDisconnectedNetworkPlayersWithAI(bool isNetworkGame, NetworkRo sprintf(szBuf,Lang::getInstance().get("LogScreenGameLoadingCreatingAIFaction","",true).c_str(),i); logger.add(szBuf, true); - Lang &lang= Lang::getInstance(); string msg = "Player #%d [%s] has disconnected, switching player to AI mode!"; if(lang.hasString("GameSwitchPlayerToAI")) { msg = lang.get("GameSwitchPlayerToAI"); } sprintf(szBuf,msg.c_str(),i+1,this->gameSettings.getNetworkPlayerName(i).c_str()); + + commander.tryNetworkPlayerDisconnected(i); } else { - Lang &lang= Lang::getInstance(); string msg = "Player #%d [%s] has disconnected, but player was only an observer!"; if(lang.hasString("GameSwitchPlayerObserverToAI")) { msg = lang.get("GameSwitchPlayerObserverToAI"); @@ -1573,7 +1578,6 @@ void Game::ReplaceDisconnectedNetworkPlayersWithAI(bool isNetworkGame, NetworkRo sprintf(szBuf,msg.c_str(),i+1,this->gameSettings.getNetworkPlayerName(i).c_str()); } - Lang &lang= Lang::getInstance(); const vector languageList = this->gameSettings.getUniqueNetworkPlayerLanguages(); for(unsigned int j = 0; j < languageList.size(); ++j) { bool localEcho = (languageList[j] == lang.getLanguage()); diff --git a/source/glest_game/game/game_settings.h b/source/glest_game/game/game_settings.h index 4d3ce3f1..63263838 100644 --- a/source/glest_game/game/game_settings.h +++ b/source/glest_game/game/game_settings.h @@ -54,6 +54,7 @@ private: string networkPlayerNames[GameConstants::maxPlayers]; int networkPlayerStatuses[GameConstants::maxPlayers]; string networkPlayerLanguages[GameConstants::maxPlayers]; + int networkPlayerGameStatus[GameConstants::maxPlayers]; ControlType factionControls[GameConstants::maxPlayers]; int resourceMultiplierIndex[GameConstants::maxPlayers]; @@ -89,6 +90,8 @@ private: public: + static string playerDisconnectedText; + GameSettings() { defaultUnits=false; defaultResources=false; @@ -114,6 +117,7 @@ public: resourceMultiplierIndex[i] = 1.0f; teams[i] = 0; startLocationIndex[i] = i; + networkPlayerGameStatus[i] = 0; } flagTypes1 = ft1_none; @@ -129,17 +133,25 @@ public: // default copy constructor will do fine, and will maintain itself ;) //get - const string &getDescription() const {return description;} - const string &getMap() const {return map;} - const string &getTileset() const {return tileset;} - const string &getTech() const {return tech;} - const string &getScenario() const {return scenario;} - const string &getScenarioDir() const {return scenarioDir;} + const string &getDescription() const {return description;} + const string &getMap() const {return map;} + const string &getTileset() const {return tileset;} + const string &getTech() const {return tech;} + const string &getScenario() const {return scenario;} + const string &getScenarioDir() const {return scenarioDir;} const string &getFactionTypeName(int factionIndex) const {return factionTypeNames[factionIndex];} - const string &getNetworkPlayerName(int factionIndex) const {return networkPlayerNames[factionIndex];} + string getNetworkPlayerName(int factionIndex) const { + string result = networkPlayerNames[factionIndex]; + if(networkPlayerGameStatus[factionIndex] == 1) { + result = playerDisconnectedText + result; + } + return result; + } const int getNetworkPlayerStatuses(int factionIndex) const { return networkPlayerStatuses[factionIndex];} const string getNetworkPlayerLanguages(int factionIndex) const { return networkPlayerLanguages[factionIndex];} + const int getNetworkPlayerGameStatus(int factionIndex) const { return networkPlayerGameStatus[factionIndex];} + const vector getUniqueNetworkPlayerLanguages() const { vector languageList; for(int i = 0; i < GameConstants::maxPlayers; ++i) { @@ -213,6 +225,8 @@ public: void setFactionTypeName(int factionIndex, const string& factionTypeName) {this->factionTypeNames[factionIndex]= factionTypeName;} void setNetworkPlayerName(int factionIndex,const string& playername) {this->networkPlayerNames[factionIndex]= playername;} void setNetworkPlayerStatuses(int factionIndex,int status) {this->networkPlayerStatuses[factionIndex]= status;} + + void setNetworkPlayerGameStatus(int factionIndex,int status) {this->networkPlayerGameStatus[factionIndex]= status;} void setNetworkPlayerLanguages(int factionIndex, string language) {this->networkPlayerLanguages[factionIndex]=language;} void setFactionControl(int factionIndex, ControlType controller) {this->factionControls[factionIndex]= controller;} @@ -334,6 +348,14 @@ public: networkPlayerStatusesNode->addAttribute("status",intToStr(networkPlayerStatuses[idx]), mapTagReplacements); } + // int networkPlayerStatuses[GameConstants::maxPlayers]; + for(int idx =0; idx < GameConstants::maxPlayers; idx++) { + XmlNode *networkPlayerStatusesNode = gameSettingsNode->addChild("networkPlayerGameStatus"); + networkPlayerStatusesNode->addAttribute("game_status",intToStr(networkPlayerGameStatus[idx]), mapTagReplacements); + } + + + // string networkPlayerLanguages[GameConstants::maxPlayers]; for(int idx =0; idx < GameConstants::maxPlayers; idx++) { XmlNode *networkPlayerLanguagesNode = gameSettingsNode->addChild("networkPlayerLanguages"); @@ -451,6 +473,12 @@ public: networkPlayerStatuses[idx] = networkPlayerStatusesNode->getAttribute("status")->getIntValue(); } + // int networkPlayerStatuses[GameConstants::maxPlayers]; + for(int idx =0; idx < GameConstants::maxPlayers; idx++) { + const XmlNode *networkPlayerGameStatusNode = gameSettingsNode->getChild("networkPlayerGameStatus",idx); + networkPlayerGameStatus[idx] = networkPlayerGameStatusNode->getAttribute("game_status")->getIntValue(); + } + // string networkPlayerLanguages[GameConstants::maxPlayers]; for(int idx =0; idx < GameConstants::maxPlayers; idx++) { const XmlNode *networkPlayerLanguagesNode = gameSettingsNode->getChild("networkPlayerLanguages",idx); diff --git a/source/glest_game/network/network_types.h b/source/glest_game/network/network_types.h index aaf6d136..10a3add2 100644 --- a/source/glest_game/network/network_types.h +++ b/source/glest_game/network/network_types.h @@ -74,7 +74,8 @@ enum NetworkCommandType { nctSetMeetingPoint, nctSwitchTeam, nctSwitchTeamVote, - nctPauseResume + nctPauseResume, + nctPlayerStatusChange //nctNetworkCommand };