diff --git a/source/glest_game/game/chat_manager.cpp b/source/glest_game/game/chat_manager.cpp index b3ab9db0..17998eff 100644 --- a/source/glest_game/game/chat_manager.cpp +++ b/source/glest_game/game/chat_manager.cpp @@ -32,7 +32,7 @@ namespace Glest{ namespace Game{ const int ChatManager::maxTextLenght= 64; -ChatManager::ChatManager(){ +ChatManager::ChatManager() { console= NULL; editEnabled= false; teamMode= false; @@ -40,21 +40,21 @@ ChatManager::ChatManager(){ disableTeamMode = false; } -void ChatManager::init(Console* console, int thisTeamIndex, const bool inMenu){ +void ChatManager::init(Console* console, int thisTeamIndex, const bool inMenu) { this->console= console; this->thisTeamIndex= thisTeamIndex; this->disableTeamMode= false; this->inMenu=inMenu; } -void ChatManager::keyUp(char key){ +void ChatManager::keyUp(char key) { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); try { - if(editEnabled){ + if(editEnabled) { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] key = [%c] [%d]\n",__FILE__,__FUNCTION__,__LINE__,key,key); - if(key==vkEscape) + if(key == vkEscape) { text.clear(); editEnabled= false; @@ -78,7 +78,7 @@ void ChatManager::setDisableTeamMode(bool value) { } } -void ChatManager::keyDown(char key){ +void ChatManager::keyDown(char key) { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] key = [%c] [%d]\n",__FILE__,__FUNCTION__,__LINE__,key,key); try { @@ -112,19 +112,21 @@ void ChatManager::keyDown(char key){ { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] key = [%c] [%d]\n",__FILE__,__FUNCTION__,__LINE__,key,key); - if(editEnabled){ + if(editEnabled == true) { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] key = [%c] [%d]\n",__FILE__,__FUNCTION__,__LINE__,key,key); GameNetworkInterface *gameNetworkInterface= NetworkManager::getInstance().getGameNetworkInterface(); - if(!text.empty()) { - string playerName = gameNetworkInterface->getHumanPlayerName(); + if(text.empty() == false) { + string playerName = gameNetworkInterface->getHumanPlayerName(); + int playerIndex = gameNetworkInterface->getHumanPlayerIndex(); + console->addLine(playerName + ": " + text,false,playerIndex); - console->addLine(playerName + ": " + text); gameNetworkInterface->sendTextMessage(text, teamMode? thisTeamIndex: -1); - if(!inMenu) editEnabled= false; + if(inMenu == false) { + editEnabled= false; + } } - else - { + else { editEnabled= false; } text.clear(); @@ -184,9 +186,8 @@ void ChatManager::updateNetwork() { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] got nmtText [%s] for team = %d\n",__FILE__,__FUNCTION__,msg.chatText.c_str(),teamIndex); - if(teamIndex==-1 || teamIndex==thisTeamIndex){ - //console->addLine(msg.chatText, true); - console->addLine(msg.chatSender + ": " + msg.chatText, true); + if(teamIndex == -1 || teamIndex == thisTeamIndex) { + console->addLine(msg.chatSender + ": " + msg.chatText, true, msg.chatPlayerIndex); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] Added text to console\n",__FILE__,__FUNCTION__); } diff --git a/source/glest_game/game/console.cpp b/source/glest_game/game/console.cpp index 6c7cea60..ef619dfd 100644 --- a/source/glest_game/game/console.cpp +++ b/source/glest_game/game/console.cpp @@ -28,31 +28,29 @@ namespace Glest{ namespace Game{ // class Console // ===================================================== -Console::Console(){ +Console::Console() { //config - maxLines= Config::getInstance().getInt("ConsoleMaxLines"); - maxStoredLines= Config::getInstance().getInt("ConsoleMaxLinesStored"); - timeout= Config::getInstance().getInt("ConsoleTimeout"); - - timeElapsed= 0.0f; + maxLines = Config::getInstance().getInt("ConsoleMaxLines"); + maxStoredLines = Config::getInstance().getInt("ConsoleMaxLinesStored"); + timeout = Config::getInstance().getInt("ConsoleTimeout"); + timeElapsed = 0.0f; } -void Console::addStdMessage(const string &s){ +void Console::addStdMessage(const string &s) { addLine(Lang::getInstance().get(s)); } -void Console::addLine(string line, bool playSound){ - try - { - if(playSound){ +void Console::addLine(string line, bool playSound, int playerIndex) { + try { + if(playSound == true) { SoundRenderer::getInstance().playFx(CoreData::getInstance().getClickSoundA()); } - lines.insert(lines.begin(), StringTimePair(line, timeElapsed)); - if(lines.size()>maxLines){ + lines.insert(lines.begin(), StringTimePair(line, StringTimePairData(timeElapsed,playerIndex))); + if(lines.size() > maxLines) { lines.pop_back(); } - storedLines.insert(storedLines.begin(), StringTimePair(line, timeElapsed)); - if(storedLines.size()>maxStoredLines){ + storedLines.insert(storedLines.begin(), StringTimePair(line, StringTimePairData(timeElapsed,playerIndex))); + if(storedLines.size() > maxStoredLines) { storedLines.pop_back(); } } @@ -64,23 +62,23 @@ void Console::addLine(string line, bool playSound){ } } -void Console::clearStoredLines(){ - while(!storedLines.empty()){ +void Console::clearStoredLines() { + while(storedLines.empty() == false) { storedLines.pop_back(); } } -void Console::update(){ - timeElapsed+= 1.f/GameConstants::updateFps; +void Console::update() { + timeElapsed += 1.f / GameConstants::updateFps; - if(!lines.empty()){ - if(lines.back().second StringTimePair; + // The float is elapsed time, the int is playerindex (-1 is no player) + typedef pair StringTimePairData; + typedef pair StringTimePair; typedef vector Lines; typedef Lines::const_iterator LineIterator; @@ -45,9 +47,6 @@ private: Lines lines; Lines storedLines; - //this should be deleted from here someday - bool won, lost; - //config int maxLines; int maxStoredLines; @@ -57,13 +56,16 @@ public: Console(); int getStoredLineCount() const {return storedLines.size();} - int getLineCount() const {return lines.size();} - string getLine(int i) const { if(i < 0 || i >= lines.size()) throw runtime_error("i >= Lines.size()"); return lines[i].first;} - string getStoredLine(int i) const { if(i < 0 || i >= storedLines.size()) throw runtime_error("i >= storedLines.size()"); return storedLines[i].first;} + int getLineCount() const {return lines.size();} + string getLine(int i) const { if(i < 0 || i >= lines.size()) throw runtime_error("i >= Lines.size()"); return lines[i].first;} + string getStoredLine(int i) const { if(i < 0 || i >= storedLines.size()) throw runtime_error("i >= storedLines.size()"); return storedLines[i].first;} + + int getLinePlayerIndex(int i) const { if(i < 0 || i >= lines.size()) throw runtime_error("i >= Lines.size()"); return lines[i].second.second;} + int getStoredLinePlayerIndex(int i) const { if(i < 0 || i >= storedLines.size()) throw runtime_error("i >= storedLines.size()"); return storedLines[i].second.second;} void clearStoredLines(); void addStdMessage(const string &s); - void addLine(string line, bool playSound= false); + void addLine(string line, bool playSound= false,int playerIndex=-1); void update(); bool isEmpty(); }; diff --git a/source/glest_game/game/game_constants.h b/source/glest_game/game/game_constants.h index 3fdd7ede..8dc1080f 100644 --- a/source/glest_game/game/game_constants.h +++ b/source/glest_game/game/game_constants.h @@ -92,6 +92,8 @@ public: static const char *OBSERVER_SLOTNAME; static const char *RANDOMFACTION_SLOTNAME; + + static const char *playerTextureCacheLookupKey; }; enum PathType { diff --git a/source/glest_game/global/config.cpp b/source/glest_game/global/config.cpp index 217cc5c8..0f282c2d 100644 --- a/source/glest_game/global/config.cpp +++ b/source/glest_game/global/config.cpp @@ -45,6 +45,8 @@ const char *GameConstants::folder_path_screenshots = "screens/"; const char *GameConstants::OBSERVER_SLOTNAME = "*Observer*"; const char *GameConstants::RANDOMFACTION_SLOTNAME = "*Random*"; +const char *GameConstants::playerTextureCacheLookupKey = "playerTextureCache"; + // ===================================================== // class Config // ===================================================== diff --git a/source/glest_game/graphics/renderer.cpp b/source/glest_game/graphics/renderer.cpp index f041a827..ffb57521 100644 --- a/source/glest_game/graphics/renderer.cpp +++ b/source/glest_game/graphics/renderer.cpp @@ -25,7 +25,7 @@ #include "factory_repository.h" #include #include - +#include "cache_manager.h" #include "leak_dumper.h" using namespace Shared::Graphics; @@ -762,7 +762,7 @@ void Renderer::renderBackground(const Texture2D *texture) { assertGl(); } -void Renderer::renderTextureQuad(int x, int y, int w, int h, const Texture2D *texture, float alpha){ +void Renderer::renderTextureQuad(int x, int y, int w, int h, const Texture2D *texture, float alpha,const Vec3f *color){ assertGl(); glPushAttrib(GL_ENABLE_BIT); @@ -771,7 +771,14 @@ void Renderer::renderTextureQuad(int x, int y, int w, int h, const Texture2D *te glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); - glColor4f(1.f, 1.f, 1.f, alpha); + if(color != NULL) { + Vec4f newColor(*color); + newColor.w = alpha; + glColor4fv(newColor.ptr()); + } + else { + glColor4f(1.f, 1.f, 1.f, alpha); + } renderQuad(x, y, w, h, texture); glPopAttrib(); @@ -789,15 +796,31 @@ void Renderer::renderConsole(const Console *console,const bool showFullConsole,c glEnable(GL_BLEND); Vec4f fontColor; - if(game!=NULL){ - fontColor=game->getGui()->getDisplay()->getColor(); + if(game != NULL) { + fontColor = game->getGui()->getDisplay()->getColor(); } else { // white shadowed is default ( in the menu for example ) fontColor=Vec4f(1.f, 1.f, 1.f, 0.0f); } - if(showFullConsole){ - for(int i=0; igetStoredLineCount(); ++i){ + + Vec4f defaultFontColor = fontColor; + + if(showFullConsole) { + std::map &crcPlayerTextureCache = CacheManager::getCachedItem< std::map >(GameConstants::playerTextureCacheLookupKey); + + for(int i = 0; i < console->getStoredLineCount(); ++i) { + int playerIndex = console->getStoredLinePlayerIndex(i); + if(playerIndex >= 0) { + Vec3f playerColor = crcPlayerTextureCache[playerIndex]->getPixmap()->getPixel3f(0, 0); + fontColor.x = playerColor.x; + fontColor.y = playerColor.y; + fontColor.z = playerColor.z; + } + else { + fontColor = defaultFontColor; + } + renderTextShadow( console->getStoredLine(i), CoreData::getInstance().getConsoleFont(), @@ -806,7 +829,20 @@ void Renderer::renderConsole(const Console *console,const bool showFullConsole,c } } else if(showMenuConsole) { - for(int i=0; igetStoredLineCount() && i &crcPlayerTextureCache = CacheManager::getCachedItem< std::map >(GameConstants::playerTextureCacheLookupKey); + + for(int i = 0; i < console->getStoredLineCount() && i < maxConsoleLines; ++i) { + int playerIndex = console->getStoredLinePlayerIndex(i); + if(playerIndex >= 0) { + Vec3f playerColor = crcPlayerTextureCache[playerIndex]->getPixmap()->getPixel3f(0, 0); + fontColor.x = playerColor.x; + fontColor.y = playerColor.y; + fontColor.z = playerColor.z; + } + else { + fontColor = defaultFontColor; + } + renderTextShadow( console->getStoredLine(i), CoreData::getInstance().getConsoleFont(), @@ -815,7 +851,20 @@ void Renderer::renderConsole(const Console *console,const bool showFullConsole,c } } else { - for(int i=0; igetLineCount(); ++i) { + std::map &crcPlayerTextureCache = CacheManager::getCachedItem< std::map >(GameConstants::playerTextureCacheLookupKey); + + for(int i = 0; i < console->getLineCount(); ++i) { + int playerIndex = console->getLinePlayerIndex(i); + if(playerIndex >= 0) { + Vec3f playerColor = crcPlayerTextureCache[playerIndex]->getPixmap()->getPixel3f(0, 0); + fontColor.x = playerColor.x; + fontColor.y = playerColor.y; + fontColor.z = playerColor.z; + } + else { + fontColor = defaultFontColor; + } + renderTextShadow( console->getLine(i), CoreData::getInstance().getConsoleFont(), @@ -826,24 +875,23 @@ void Renderer::renderConsole(const Console *console,const bool showFullConsole,c glPopAttrib(); } -void Renderer::renderChatManager(const ChatManager *chatManager){ +void Renderer::renderChatManager(const ChatManager *chatManager) { Vec4f fontColor; Lang &lang= Lang::getInstance(); - if(chatManager->getEditEnabled()){ - string text; + if(chatManager->getEditEnabled()) { + string text=""; - if(chatManager->getTeamMode()){ - text+= lang.get("Team"); + if(chatManager->getTeamMode()) { + text += lang.get("Team"); } - else - { - text+= lang.get("All"); + else { + text += lang.get("All"); } - text+= ": " + chatManager->getText() + "_"; + text += ": " + chatManager->getText() + "_"; - if(game!=NULL){ - fontColor=game->getGui()->getDisplay()->getColor(); + if(game != NULL) { + fontColor = game->getGui()->getDisplay()->getColor(); } else { // white shadowed is default ( in the menu for example ) @@ -1032,6 +1080,23 @@ void Renderer::renderTextShadow(const string &text, const Font2D *font,const Vec // ============= COMPONENTS ============================= void Renderer::renderLabel(const GraphicLabel *label) { + Vec4f *colorWithAlpha = NULL; + renderLabel(label,colorWithAlpha); +} + +void Renderer::renderLabel(const GraphicLabel *label,const Vec3f *color) { + if(color != NULL) { + Vec4f colorWithAlpha = Vec4f(*color); + colorWithAlpha.w = GraphicComponent::getFade(); + renderLabel(label,&colorWithAlpha); + } + else { + Vec4f *colorWithAlpha = NULL; + renderLabel(label,colorWithAlpha); + } +} + +void Renderer::renderLabel(const GraphicLabel *label,const Vec4f *color) { if(label->getVisible() == false) { return; } @@ -1051,7 +1116,12 @@ void Renderer::renderLabel(const GraphicLabel *label) { textPos= Vec2i(x, y+h/4); } - renderText(label->getText(), label->getFont(), GraphicComponent::getFade(), textPos.x, textPos.y, label->getCentered()); + if(color != NULL) { + renderText(label->getText(), label->getFont(), (*color), textPos.x, textPos.y, label->getCentered()); + } + else { + renderText(label->getText(), label->getFont(), GraphicComponent::getFade(), textPos.x, textPos.y, label->getCentered()); + } glPopAttrib(); } diff --git a/source/glest_game/graphics/renderer.h b/source/glest_game/graphics/renderer.h index 55d4b090..ee081bea 100644 --- a/source/glest_game/graphics/renderer.h +++ b/source/glest_game/graphics/renderer.h @@ -304,7 +304,7 @@ public: void renderMouse2d(int mouseX, int mouseY, int anim, float fade= 0.f); void renderMouse3d(); void renderBackground(const Texture2D *texture); - void renderTextureQuad(int x, int y, int w, int h, const Texture2D *texture, float alpha=1.f); + void renderTextureQuad(int x, int y, int w, int h, const Texture2D *texture, float alpha=1.f,const Vec3f *color=NULL); void renderConsole(const Console *console, const bool showAll=false, const bool showMenuConsole=false); void renderChatManager(const ChatManager *chatManager); void renderResourceStatus(); @@ -316,6 +316,8 @@ public: //components void renderLabel(const GraphicLabel *label); + void renderLabel(const GraphicLabel *label,const Vec3f *color); + void renderLabel(const GraphicLabel *label,const Vec4f *color); void renderButton(const GraphicButton *button); void renderListBox(const GraphicListBox *listBox); void renderMessageBox(const GraphicMessageBox *listBox); diff --git a/source/glest_game/main/main.cpp b/source/glest_game/main/main.cpp index ea14ed8e..cff41420 100644 --- a/source/glest_game/main/main.cpp +++ b/source/glest_game/main/main.cpp @@ -34,6 +34,7 @@ #include #include "sound_renderer.h" #include "font_gl.h" +#include "cache_manager.h" #include "leak_dumper.h" #ifndef WIN32 @@ -934,6 +935,21 @@ int glestMain(int argc, char** argv){ //printf("In [%s::%s Line: %d] screenShotsPath [%s]\n",__FILE__,__FUNCTION__,__LINE__,screenShotsPath.c_str()); } + // Cache Player textures - START + std::map &crcPlayerTextureCache = CacheManager::getCachedItem< std::map >(GameConstants::playerTextureCacheLookupKey); + for(int index = 0; index < GameConstants::maxPlayers; ++index) { + string playerTexture = "data/core/faction_textures/faction" + intToStr(index) + ".tga"; + if(fileExists(playerTexture) == true) { + Texture2D *texture = Renderer::getInstance().newTexture2D(rsGlobal); + texture->load(playerTexture); + crcPlayerTextureCache[index] = texture; + } + else { + crcPlayerTextureCache[index] = NULL; + } + } + // Cache Player textures - END + if(config.getBool("AllowGameDataSynchCheck","false") == true) { vector techDataPaths = config.getPathListForType(ptTechs); preCacheThread.reset(new FileCRCPreCacheThread()); diff --git a/source/glest_game/menu/menu_state_connected_game.cpp b/source/glest_game/menu/menu_state_connected_game.cpp index 1636e76c..8077c8fa 100644 --- a/source/glest_game/menu/menu_state_connected_game.cpp +++ b/source/glest_game/menu/menu_state_connected_game.cpp @@ -27,7 +27,7 @@ #include "game.h" #include #include - +#include "cache_manager.h" #include "leak_dumper.h" @@ -532,15 +532,31 @@ void MenuStateConnectedGame::render() { //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); - int i; - renderer.renderButton(&buttonDisconnect); //renderer.renderButton(&buttonPlayNow); //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); - for(i=0; i &crcPlayerTextureCache = CacheManager::getCachedItem< std::map >(GameConstants::playerTextureCacheLookupKey); + + for(int i = 0; i < GameConstants::maxPlayers; ++i) { + if(crcPlayerTextureCache[i] != NULL) { + // Render the player # label the player's color + Vec3f playerColor = crcPlayerTextureCache[i]->getPixmap()->getPixel3f(0, 0); + renderer.renderLabel(&labelPlayers[i],&playerColor); + + // Blend the color with white so make it more readable + Vec4f newColor(1.f, 1.f, 1.f, 0.57); + renderer.renderLabel(&labelPlayers[i],&newColor); + + //int quadWidth = labelPlayerNames[i].getX() - labelPlayers[i].getX() - 5; + //renderer.renderTextureQuad(labelPlayers[i].getX(), labelPlayers[i].getY(), quadWidth, labelPlayers[i].getH(), crcPlayerTextureCache[i],1.0f,&playerColor); + } + else { + renderer.renderLabel(&labelPlayers[i]); + } + renderer.renderListBox(&listBoxControls[i]); if(listBoxControls[i].getSelectedItemIndex()!=ctClosed){ renderer.renderListBox(&listBoxFactions[i]); diff --git a/source/glest_game/menu/menu_state_custom_game.cpp b/source/glest_game/menu/menu_state_custom_game.cpp index 0f8b033e..75eec036 100644 --- a/source/glest_game/menu/menu_state_custom_game.cpp +++ b/source/glest_game/menu/menu_state_custom_game.cpp @@ -27,7 +27,7 @@ #include #include #include - +#include "cache_manager.h" #include "leak_dumper.h" @@ -1038,13 +1038,30 @@ void MenuStateCustomGame::render() { } else { - int i; renderer.renderButton(&buttonReturn); renderer.renderButton(&buttonPlayNow); renderer.renderButton(&buttonRestoreLastSettings); - - for(i=0; i &crcPlayerTextureCache = CacheManager::getCachedItem< std::map >(GameConstants::playerTextureCacheLookupKey); + + for(int i = 0; i < GameConstants::maxPlayers; ++i) { + if(crcPlayerTextureCache[i] != NULL) { + // Render the player # label the player's color + Vec3f playerColor = crcPlayerTextureCache[i]->getPixmap()->getPixel3f(0, 0); + renderer.renderLabel(&labelPlayers[i],&playerColor); + + // Blend the color with white so make it more readable + Vec4f newColor(1.f, 1.f, 1.f, 0.57); + renderer.renderLabel(&labelPlayers[i],&newColor); + + //int quadWidth = labelPlayerNames[i].getX() - labelPlayers[i].getX() - 5; + //renderer.renderTextureQuad(labelPlayers[i].getX(), labelPlayers[i].getY(), quadWidth, labelPlayers[i].getH(), crcPlayerTextureCache[i],1.0f,&playerColor); + } + else { + renderer.renderLabel(&labelPlayers[i]); + } + renderer.renderLabel(&labelPlayerNames[i]); renderer.renderListBox(&listBoxControls[i]); diff --git a/source/glest_game/network/client_interface.cpp b/source/glest_game/network/client_interface.cpp index f400f4f0..84b7f7c5 100755 --- a/source/glest_game/network/client_interface.cpp +++ b/source/glest_game/network/client_interface.cpp @@ -435,7 +435,7 @@ void ClientInterface::updateLobby() { { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] got nmtText\n",__FILE__,__FUNCTION__); - ChatMsgInfo msg(networkMessageText.getText().c_str(),networkMessageText.getSender().c_str(),networkMessageText.getTeamIndex()); + ChatMsgInfo msg(networkMessageText.getText().c_str(),networkMessageText.getSender().c_str(),networkMessageText.getTeamIndex(),networkMessageText.getPlayerIndex()); this->addChatInfo(msg); } } @@ -622,7 +622,7 @@ void ClientInterface::updateKeyframe(int frameCount) sleep(0); } - ChatMsgInfo msg(networkMessageText.getText().c_str(),networkMessageText.getSender().c_str(),networkMessageText.getTeamIndex()); + ChatMsgInfo msg(networkMessageText.getText().c_str(),networkMessageText.getSender().c_str(),networkMessageText.getTeamIndex(),networkMessageText.getPlayerIndex()); this->addChatInfo(msg); } break; @@ -793,16 +793,16 @@ void ClientInterface::waitUntilReady(Checksum* checksum) { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] END\n",__FILE__,__FUNCTION__); } -void ClientInterface::sendTextMessage(const string &text, int teamIndex, bool echoLocal){ +void ClientInterface::sendTextMessage(const string &text, int teamIndex, bool echoLocal) { string humanPlayerName = getHumanPlayerName(); SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] humanPlayerName = [%s] playerIndex = %d\n",__FILE__,__FUNCTION__,__LINE__,humanPlayerName.c_str(),playerIndex); - NetworkMessageText networkMessageText(text, humanPlayerName, teamIndex); + NetworkMessageText networkMessageText(text, humanPlayerName, teamIndex,playerIndex); sendMessage(&networkMessageText); if(echoLocal == true) { - ChatMsgInfo msg(networkMessageText.getText().c_str(),networkMessageText.getSender().c_str(),networkMessageText.getTeamIndex()); + ChatMsgInfo msg(networkMessageText.getText().c_str(),networkMessageText.getSender().c_str(),networkMessageText.getTeamIndex(),networkMessageText.getPlayerIndex()); this->addChatInfo(msg); } @@ -960,7 +960,7 @@ bool ClientInterface::shouldDiscardNetworkMessage(NetworkMessageType networkMess NetworkMessageText netMsg = NetworkMessageText(); this->receiveMessage(&netMsg); - ChatMsgInfo msg(netMsg.getText().c_str(),netMsg.getSender().c_str(),netMsg.getTeamIndex()); + ChatMsgInfo msg(netMsg.getText().c_str(),netMsg.getSender().c_str(),netMsg.getTeamIndex(),netMsg.getPlayerIndex()); this->addChatInfo(msg); } break; diff --git a/source/glest_game/network/client_interface.h b/source/glest_game/network/client_interface.h index 21f7f9aa..8c2b546c 100644 --- a/source/glest_game/network/client_interface.h +++ b/source/glest_game/network/client_interface.h @@ -103,6 +103,7 @@ public: const string &getVersionString() const {return versionString;} virtual string getHumanPlayerName(int index=-1); + virtual int getHumanPlayerIndex() const {return playerIndex;} protected: diff --git a/source/glest_game/network/connection_slot.cpp b/source/glest_game/network/connection_slot.cpp index eebe5ece..158c94a3 100644 --- a/source/glest_game/network/connection_slot.cpp +++ b/source/glest_game/network/connection_slot.cpp @@ -311,7 +311,7 @@ void ConnectionSlot::update(bool checkForNewClients) { if(gotIntro == true) { NetworkMessageText networkMessageText; if(receiveMessage(&networkMessageText)) { - ChatMsgInfo msg(networkMessageText.getText().c_str(),networkMessageText.getSender().c_str(),networkMessageText.getTeamIndex()); + ChatMsgInfo msg(networkMessageText.getText().c_str(),networkMessageText.getSender().c_str(),networkMessageText.getTeamIndex(),networkMessageText.getPlayerIndex()); this->addChatInfo(msg); gotTextMsg = true; diff --git a/source/glest_game/network/connection_slot.h b/source/glest_game/network/connection_slot.h index 8b340eb3..2b785d55 100644 --- a/source/glest_game/network/connection_slot.h +++ b/source/glest_game/network/connection_slot.h @@ -162,6 +162,7 @@ public: void validateConnection(); virtual string getHumanPlayerName(int index=-1); + virtual int getHumanPlayerIndex() const {return playerIndex;} protected: diff --git a/source/glest_game/network/network_interface.h b/source/glest_game/network/network_interface.h index c3019847..1e01c98f 100644 --- a/source/glest_game/network/network_interface.h +++ b/source/glest_game/network/network_interface.h @@ -45,21 +45,24 @@ class ChatMsgInfo { protected: void copyAll(const ChatMsgInfo &obj) { - this->chatText = obj.chatText.c_str(); - this->chatSender = obj.chatSender.c_str(); - this->chatTeamIndex = obj.chatTeamIndex; + this->chatText = obj.chatText.c_str(); + this->chatSender = obj.chatSender.c_str(); + this->chatTeamIndex = obj.chatTeamIndex; + this->chatPlayerIndex = obj.chatPlayerIndex; } public: ChatMsgInfo() { - this->chatText = ""; - this->chatSender = ""; - this->chatTeamIndex = -1; + this->chatText = ""; + this->chatSender = ""; + this->chatTeamIndex = -1; + this->chatPlayerIndex = -1; } - ChatMsgInfo(string chatText, string chatSender,int chatTeamIndex) { + ChatMsgInfo(string chatText, string chatSender,int chatTeamIndex, int chatPlayerIndex) { this->chatText = chatText; this->chatSender = chatSender; this->chatTeamIndex = chatTeamIndex; + this->chatPlayerIndex = chatPlayerIndex; } ChatMsgInfo(const ChatMsgInfo& obj) { copyAll(obj); @@ -72,6 +75,7 @@ public: string chatText; string chatSender; int chatTeamIndex; + int chatPlayerIndex; }; @@ -107,6 +111,7 @@ public: virtual const Socket* getSocket() const= 0; virtual void close()= 0; virtual string getHumanPlayerName(int index=-1) = 0; + virtual int getHumanPlayerIndex() const = 0; static void setDisplayMessageFunction(DisplayMessageFunction pDisplayMessage) { pCB_DisplayMessage = pDisplayMessage; } static DisplayMessageFunction getDisplayMessageFunction() { return pCB_DisplayMessage; } diff --git a/source/glest_game/network/network_message.cpp b/source/glest_game/network/network_message.cpp index 0dce2d44..2af9a153 100644 --- a/source/glest_game/network/network_message.cpp +++ b/source/glest_game/network/network_message.cpp @@ -393,7 +393,7 @@ void NetworkMessageCommandList::send(Socket* socket) const{ // class NetworkMessageText // ===================================================== -NetworkMessageText::NetworkMessageText(const string &text, const string &sender, int teamIndex){ +NetworkMessageText::NetworkMessageText(const string &text, const string &sender, int teamIndex, int playerIndex) { if(text.length() >= maxTextStringSize) { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] WARNING / ERROR - text [%s] length = %d, max = %d\n",__FILE__,__FUNCTION__,__LINE__,text.c_str(),text.length(),maxTextStringSize); @@ -404,10 +404,11 @@ NetworkMessageText::NetworkMessageText(const string &text, const string &sender, //throw runtime_error("NetworkMessageText - sender.length() >= maxSenderStringSize"); } - data.messageType= nmtText; - data.text= text; - data.sender= sender; - data.teamIndex= teamIndex; + data.messageType = nmtText; + data.text = text; + data.sender = sender; + data.teamIndex = teamIndex; + data.playerIndex = playerIndex; } bool NetworkMessageText::receive(Socket* socket){ diff --git a/source/glest_game/network/network_message.h b/source/glest_game/network/network_message.h index f3357f35..0f4f2fa9 100644 --- a/source/glest_game/network/network_message.h +++ b/source/glest_game/network/network_message.h @@ -282,7 +282,7 @@ public: // ===================================================== #pragma pack(push, 1) -class NetworkMessageText: public NetworkMessage{ +class NetworkMessageText: public NetworkMessage { private: static const int maxTextStringSize= 340; static const int maxSenderStringSize= 60; @@ -293,6 +293,7 @@ private: NetworkString text; NetworkString sender; int8 teamIndex; + int8 playerIndex; }; private: @@ -300,11 +301,12 @@ private: public: NetworkMessageText(){} - NetworkMessageText(const string &text, const string &sender, int teamIndex); + NetworkMessageText(const string &text, const string &sender, int teamIndex, int playerIndex); string getText() const {return data.text.getString();} string getSender() const {return data.sender.getString();} int getTeamIndex() const {return data.teamIndex;} + int getPlayerIndex() const {return data.playerIndex;} virtual bool receive(Socket* socket); virtual void send(Socket* socket) const; diff --git a/source/glest_game/network/server_interface.cpp b/source/glest_game/network/server_interface.cpp index f2ee87ba..4abcc323 100644 --- a/source/glest_game/network/server_interface.cpp +++ b/source/glest_game/network/server_interface.cpp @@ -679,10 +679,11 @@ void ServerInterface::update() { string newChatText = msg.chatText.c_str(); string newChatSender = msg.chatSender.c_str(); int newChatTeamIndex = msg.chatTeamIndex; + int newChatPlayerIndex = msg.chatPlayerIndex; - SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] #1 about to broadcast nmtText chatText [%s] chatSender [%s] chatTeamIndex = %d\n",__FILE__,__FUNCTION__,__LINE__,newChatText.c_str(),newChatSender.c_str(),newChatTeamIndex); + SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] #1 about to broadcast nmtText chatText [%s] chatSender [%s] chatTeamIndex = %d, newChatPlayerIndex = %d\n",__FILE__,__FUNCTION__,__LINE__,newChatText.c_str(),newChatSender.c_str(),newChatTeamIndex,newChatPlayerIndex); - NetworkMessageText networkMessageText(newChatText.c_str(),newChatSender.c_str(),newChatTeamIndex); + NetworkMessageText networkMessageText(newChatText.c_str(),newChatSender.c_str(),newChatTeamIndex,newChatPlayerIndex); broadcastMessage(&networkMessageText, connectionSlot->getPlayerIndex()); SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] after broadcast nmtText chatText [%s] chatSender [%s] chatTeamIndex = %d\n",__FILE__,__FUNCTION__,__LINE__,newChatText.c_str(),newChatSender.c_str(),newChatTeamIndex); @@ -805,16 +806,17 @@ bool ServerInterface::shouldDiscardNetworkMessage(NetworkMessageType networkMess NetworkMessageText netMsg = NetworkMessageText(); connectionSlot->receiveMessage(&netMsg); - ChatMsgInfo msg(netMsg.getText().c_str(),netMsg.getSender().c_str(),netMsg.getTeamIndex()); + ChatMsgInfo msg(netMsg.getText().c_str(),netMsg.getSender().c_str(),netMsg.getTeamIndex(),netMsg.getPlayerIndex()); this->addChatInfo(msg); string newChatText = msg.chatText.c_str(); string newChatSender = msg.chatSender.c_str(); int newChatTeamIndex = msg.chatTeamIndex; + int newChatPlayerIndex = msg.chatPlayerIndex; - SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] #1 about to broadcast nmtText chatText [%s] chatSender [%s] chatTeamIndex = %d\n",__FILE__,__FUNCTION__,__LINE__,newChatText.c_str(),newChatSender.c_str(),newChatTeamIndex); + SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] #1 about to broadcast nmtText chatText [%s] chatSender [%s] chatTeamIndex = %d, newChatPlayerIndex = %d\n",__FILE__,__FUNCTION__,__LINE__,newChatText.c_str(),newChatSender.c_str(),newChatTeamIndex,newChatPlayerIndex); - NetworkMessageText networkMessageText(newChatText.c_str(),newChatSender.c_str(),newChatTeamIndex); + NetworkMessageText networkMessageText(newChatText.c_str(),newChatSender.c_str(),newChatTeamIndex,newChatPlayerIndex); broadcastMessage(&networkMessageText, connectionSlot->getPlayerIndex()); SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] after broadcast nmtText chatText [%s] chatSender [%s] chatTeamIndex = %d\n",__FILE__,__FUNCTION__,__LINE__,newChatText.c_str(),newChatSender.c_str(),newChatTeamIndex); @@ -972,13 +974,13 @@ void ServerInterface::waitUntilReady(Checksum* checksum){ void ServerInterface::sendTextMessage(const string &text, int teamIndex, bool echoLocal) { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] text [%s] teamIndex = %d, echoLocal = %d\n",__FILE__,__FUNCTION__,__LINE__,text.c_str(),teamIndex,echoLocal); - NetworkMessageText networkMessageText(text, getHumanPlayerName().c_str(), teamIndex); + NetworkMessageText networkMessageText(text, getHumanPlayerName().c_str(), teamIndex, gameSettings.getThisFactionIndex()); broadcastMessage(&networkMessageText); if(echoLocal == true) { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__); - ChatMsgInfo msg(text.c_str(),networkMessageText.getSender().c_str(),teamIndex); + ChatMsgInfo msg(text.c_str(),networkMessageText.getSender().c_str(),teamIndex,networkMessageText.getPlayerIndex()); this->addChatInfo(msg); } @@ -1370,4 +1372,8 @@ string ServerInterface::getHumanPlayerName(int index) { return result; } +int ServerInterface::getHumanPlayerIndex() const { + return gameSettings.getThisFactionIndex(); +} + }}//end namespace diff --git a/source/glest_game/network/server_interface.h b/source/glest_game/network/server_interface.h index f47669e3..4e1a1d85 100644 --- a/source/glest_game/network/server_interface.h +++ b/source/glest_game/network/server_interface.h @@ -97,6 +97,7 @@ public: } virtual string getHumanPlayerName(int index=-1); + virtual int getHumanPlayerIndex() const; public: