From 50341e9db6e6ad7f1c60caaba182f5cee1907626 Mon Sep 17 00:00:00 2001 From: Titus Tscharntke Date: Wed, 28 Apr 2010 23:59:37 +0000 Subject: [PATCH] clients can choose team and faction ... client triggered slot change is prepared --- source/glest_game/facilities/components.cpp | 2 +- .../menu/menu_state_connected_game.cpp | 37 ++++++++++++++++-- .../menu/menu_state_connected_game.h | 3 +- .../menu/menu_state_custom_game.cpp | 20 ++++++++++ .../glest_game/network/client_interface.cpp | 9 +++++ source/glest_game/network/client_interface.h | 3 ++ source/glest_game/network/connection_slot.cpp | 16 ++++++++ source/glest_game/network/network_message.cpp | 38 ++++++++++++++++++ source/glest_game/network/network_message.h | 39 ++++++++++++++++++- .../glest_game/network/server_interface.cpp | 6 ++- source/glest_game/network/server_interface.h | 2 + 11 files changed, 168 insertions(+), 7 deletions(-) diff --git a/source/glest_game/facilities/components.cpp b/source/glest_game/facilities/components.cpp index fcb6bca4..86b87227 100644 --- a/source/glest_game/facilities/components.cpp +++ b/source/glest_game/facilities/components.cpp @@ -137,7 +137,7 @@ void GraphicListBox::setSelectedItemIndex(int index){ void GraphicListBox::setEditable(bool editable){ graphButton1.setEditable(editable); graphButton2.setEditable(editable); - editable=true; + GraphicComponent::setEditable(editable); } void GraphicListBox::setSelectedItem(string item){ diff --git a/source/glest_game/menu/menu_state_connected_game.cpp b/source/glest_game/menu/menu_state_connected_game.cpp index 6c4da6cb..e4cad033 100644 --- a/source/glest_game/menu/menu_state_connected_game.cpp +++ b/source/glest_game/menu/menu_state_connected_game.cpp @@ -51,8 +51,8 @@ MenuStateConnectedGame::MenuStateConnectedGame(Program *program, MainMenu *mainM NetworkManager &networkManager= NetworkManager::getInstance(); Config &config = Config::getInstance(); needToSetChangedGameSettings = false; - lastSetChangedGameSettings = time(NULL);; - + lastSetChangedGameSettings = time(NULL); + currentFactionName=""; currentMap=""; @@ -116,6 +116,8 @@ MenuStateConnectedGame::MenuStateConnectedGame(Program *program, MainMenu *mainM listBoxTeams[i].init(600, 550-i*30, 60); listBoxTeams[i].setEditable(false); labelNetStatus[i].init(700, 550-i*30, 60); + grabSlotButton[i].init(700, 550-i*30, 30); + grabSlotButton[i].setText(">"); } labelControl.init(200, 600, GraphicListBox::defW, GraphicListBox::defH, true); @@ -214,6 +216,28 @@ void MenuStateConnectedGame::mouseClick(int x, int y, MouseButton mouseButton){ } else { + for(int i=0; iisConnected()){ + clientInterface->setGameSettingsReceived(false); + clientInterface->sendSwitchSetupRequest(listBoxFactions[i].getSelectedItem(),clientInterface->getGameSettings()->getThisFactionIndex(),-1,listBoxTeams[i].getSelectedItemIndex()); + } + } + } + if(listBoxTeams[i].getEditable()){ + if(listBoxTeams[i].mouseClick(x, y)){ + if(clientInterface->isConnected()){ + clientInterface->setGameSettingsReceived(false); + clientInterface->sendSwitchSetupRequest(listBoxFactions[i].getSelectedItem(),clientInterface->getGameSettings()->getThisFactionIndex(),-1,listBoxTeams[i].getSelectedItemIndex()); + } + } + } + } + + // for(int i=0; igetFactionCount(); ++i){ @@ -491,6 +520,8 @@ void MenuStateConnectedGame::update() if(gameSettings->getFactionControl(i) == ctNetwork && gameSettings->getThisFactionIndex() == i){ // set my current slot to ctHuman listBoxControls[slot].setSelectedItemIndex(ctHuman); + listBoxFactions[slot].setEditable(true); + listBoxTeams[slot].setEditable(true); } settingsReceivedFromServer=true; diff --git a/source/glest_game/menu/menu_state_connected_game.h b/source/glest_game/menu/menu_state_connected_game.h index f5bf4233..3b787edf 100644 --- a/source/glest_game/menu/menu_state_connected_game.h +++ b/source/glest_game/menu/menu_state_connected_game.h @@ -49,6 +49,7 @@ private: GraphicListBox listBoxFactions[GameConstants::maxPlayers]; GraphicListBox listBoxTeams[GameConstants::maxPlayers]; GraphicLabel labelNetStatus[GameConstants::maxPlayers]; + GraphicButton grabSlotButton[GameConstants::maxPlayers]; MapInfo mapInfo; bool needToSetChangedGameSettings; @@ -61,7 +62,7 @@ private: string currentMap; bool settingsReceivedFromServer; - + public: MenuStateConnectedGame(Program *program, MainMenu *mainMenu, bool openNetworkSlots= false); diff --git a/source/glest_game/menu/menu_state_custom_game.cpp b/source/glest_game/menu/menu_state_custom_game.cpp index 83d5ef7c..5bef6226 100644 --- a/source/glest_game/menu/menu_state_custom_game.cpp +++ b/source/glest_game/menu/menu_state_custom_game.cpp @@ -523,6 +523,26 @@ void MenuStateCustomGame::update() needToSetChangedGameSettings = false; } + SwitchSetupRequest** switchSetupRequests=serverInterface->getSwitchSetupRequests(); + for(int i= 0; igetSelectedFactionName()=%s\n",switchSetupRequests[i]->getSelectedFactionName().c_str()); + //printf("switchSetupRequests[i]->getToTeam()=%d\n",switchSetupRequests[i]->getToTeam()); + + if(switchSetupRequests[i]->getSelectedFactionName()!=""){ + listBoxFactions[i].setSelectedItem(switchSetupRequests[i]->getSelectedFactionName()); + } + if(switchSetupRequests[i]->getToTeam()!=-1) + listBoxTeams[i].setSelectedItemIndex(switchSetupRequests[i]->getToTeam()); + } + delete switchSetupRequests[i]; + switchSetupRequests[i]=NULL; + } + } if(difftime(time(NULL),lastSetChangedGameSettings) >= 2) { GameSettings gameSettings; diff --git a/source/glest_game/network/client_interface.cpp b/source/glest_game/network/client_interface.cpp index 009576f1..98e6e335 100755 --- a/source/glest_game/network/client_interface.cpp +++ b/source/glest_game/network/client_interface.cpp @@ -687,6 +687,15 @@ void ClientInterface::stopServerDiscovery() { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); } +void ClientInterface::sendSwitchSetupRequest(string selectedFactionName, int8 currentFactionIndex, int8 toFactionIndex,int8 toTeam) +{ + SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); + //printf("string-cuf-tof-team= %s-%d-%d-%d\n",selectedFactionName.c_str(),currentFactionIndex,toFactionIndex,toTeam); + SwitchSetupRequest message=SwitchSetupRequest(selectedFactionName, currentFactionIndex, toFactionIndex,toTeam); + sendMessage(&message); + SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); +} + /* bool ClientInterface::getFogOfWar() { diff --git a/source/glest_game/network/client_interface.h b/source/glest_game/network/client_interface.h index d7b05bd8..4c20eb03 100644 --- a/source/glest_game/network/client_interface.h +++ b/source/glest_game/network/client_interface.h @@ -72,6 +72,7 @@ public: bool getLaunchGame() const {return launchGame;} bool getIntroDone() const {return introDone;} bool getGameSettingsReceived() const {return gameSettingsReceived;} + void setGameSettingsReceived(bool value) {gameSettingsReceived=value;} int getPlayerIndex() const {return playerIndex;} //const GameSettings *getGameSettings() {return &gameSettings;} @@ -80,6 +81,8 @@ public: void discoverServers(DiscoveredServersInterface *cb); void stopServerDiscovery(); + + void sendSwitchSetupRequest(string selectedFactionName, int8 currentFactionIndex, int8 toFactionIndex, int8 toTeam); private: void waitForMessage(); diff --git a/source/glest_game/network/connection_slot.cpp b/source/glest_game/network/connection_slot.cpp index 383c84d1..41fdc661 100644 --- a/source/glest_game/network/connection_slot.cpp +++ b/source/glest_game/network/connection_slot.cpp @@ -314,6 +314,22 @@ void ConnectionSlot::update(bool checkForNewClients) } break; + case nmtSwitchSetupRequest: + { + SwitchSetupRequest switchSetupRequest; + if(receiveMessage(&switchSetupRequest)) + { + if(serverInterface->getSwitchSetupRequests()[switchSetupRequest.getCurrentFactionIndex()]==NULL) + { + serverInterface->getSwitchSetupRequests()[switchSetupRequest.getCurrentFactionIndex()]= new SwitchSetupRequest(); + } + *(serverInterface->getSwitchSetupRequests()[switchSetupRequest.getCurrentFactionIndex()])=switchSetupRequest; + + } + break; + } + + default: { //throw runtime_error("Unexpected message in connection slot: " + intToStr(networkMessageType)); diff --git a/source/glest_game/network/network_message.cpp b/source/glest_game/network/network_message.cpp index c3216cc7..06247e20 100644 --- a/source/glest_game/network/network_message.cpp +++ b/source/glest_game/network/network_message.cpp @@ -449,4 +449,42 @@ void NetworkMessageSynchNetworkGameDataFileGet::send(Socket* socket) const } + +// ===================================================== +// class NetworkMessageSynchNetworkGameDataFileGet +// ===================================================== + +SwitchSetupRequest::SwitchSetupRequest() +{ + data.messageType= nmtSwitchSetupRequest; + data.selectedFactionName=""; + data.currentFactionIndex=-1; + data.toFactionIndex=-1; + data.toTeam = -1; +} + + +SwitchSetupRequest::SwitchSetupRequest(string selectedFactionName, int8 currentFactionIndex, int8 toFactionIndex,int8 toTeam) +{ + data.messageType= nmtSwitchSetupRequest; + data.selectedFactionName=selectedFactionName; + data.currentFactionIndex=currentFactionIndex; + data.toFactionIndex=toFactionIndex; + data.toTeam = toTeam; +} + +bool SwitchSetupRequest::receive(Socket* socket) +{ + return NetworkMessage::receive(socket, &data, sizeof(data)); +} + +void SwitchSetupRequest::send(Socket* socket) const +{ + assert(data.messageType==nmtSwitchSetupRequest); + NetworkMessage::send(socket, &data, sizeof(data)); +} + + + + }}//end namespace diff --git a/source/glest_game/network/network_message.h b/source/glest_game/network/network_message.h index 53b819ed..90121beb 100644 --- a/source/glest_game/network/network_message.h +++ b/source/glest_game/network/network_message.h @@ -38,7 +38,7 @@ enum NetworkMessageType{ nmtSynchNetworkGameDataFileCRCCheck, nmtSynchNetworkGameDataFileGet, nmtBroadCastSetup, - + nmtSwitchSetupRequest, nmtCount }; @@ -412,6 +412,43 @@ public: }; +// ===================================================== +// class SwitchSetupRequest +// +// Message sent from the server to the client +// when the client connects and vice versa +// ===================================================== + +class SwitchSetupRequest: public NetworkMessage{ +private: + static const int maxStringSize= 256; + +private: + struct Data{ + int8 messageType; + NetworkString selectedFactionName; //wanted faction name + int8 currentFactionIndex; + int8 toFactionIndex; + int8 toTeam; + }; + +private: + Data data; + +public: + SwitchSetupRequest(); + SwitchSetupRequest( string selectedFactionName, int8 currentFactionIndex, int8 toFactionIndex,int8 toTeam); + + string getSelectedFactionName() const {return data.selectedFactionName.getString();} + int getCurrentFactionIndex() const {return data.currentFactionIndex;} + int getToFactionIndex() const {return data.toFactionIndex;} + int getToTeam() const {return data.toTeam;} + + virtual bool receive(Socket* socket); + virtual void send(Socket* socket) const; +}; + + }}//end namespace #endif diff --git a/source/glest_game/network/server_interface.cpp b/source/glest_game/network/server_interface.cpp index 35fc808b..558f5d34 100644 --- a/source/glest_game/network/server_interface.cpp +++ b/source/glest_game/network/server_interface.cpp @@ -40,6 +40,7 @@ ServerInterface::ServerInterface(){ for(int i= 0; i