From a5bc6870aca7c4f68789164a088092ff3fa94715 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Mon, 6 Sep 2004 23:36:38 +0000 Subject: [PATCH] revert --- stepmania/src/NetworkSyncServer.cpp | 342 ++++++++++++++++------------ 1 file changed, 194 insertions(+), 148 deletions(-) diff --git a/stepmania/src/NetworkSyncServer.cpp b/stepmania/src/NetworkSyncServer.cpp index 838088e72e..8600a65fa8 100644 --- a/stepmania/src/NetworkSyncServer.cpp +++ b/stepmania/src/NetworkSyncServer.cpp @@ -1,10 +1,12 @@ /* NetworkSyncServer.cpp */ - +#include "global.h" #include "NetworkSyncServer.h" #include "RageLog.h" +#include -LanPlayer::LanPlayer() { +LanPlayer::LanPlayer() +{ score = 0; health = 0; feet = 0; @@ -17,21 +19,25 @@ LanPlayer::LanPlayer() { options = ""; } -StepManiaLanServer::StepManiaLanServer() { +StepManiaLanServer::StepManiaLanServer() +{ stop = true; SecondSameSelect = false; AssignPlayerIDs(); } -StepManiaLanServer::~StepManiaLanServer() { +StepManiaLanServer::~StepManiaLanServer() +{ ServerStop(); } -bool StepManiaLanServer::ServerStart() { +bool StepManiaLanServer::ServerStart() +{ server.blocking = 0; /* Turn off blocking */ if (server.create()) if (server.bind(8765)) - if (server.listen()) { + if (server.listen()) + { stop = false; statsTime = time(NULL); return true; @@ -48,9 +54,9 @@ bool StepManiaLanServer::ServerStart() { return false; } -void StepManiaLanServer::ServerStop() { - int x; - for (x = 0; x < NUMBERCLIENTS; x++) { +void StepManiaLanServer::ServerStop() +{ + for (int x = 0; x < NUMBERCLIENTS; ++x) { Client[x].clientSocket.close(); Client[x].Used = false; } @@ -58,12 +64,15 @@ void StepManiaLanServer::ServerStop() { stop = true; } -void StepManiaLanServer::ServerUpdate() { - if (!stop) { +void StepManiaLanServer::ServerUpdate() +{ + if (!stop) + { NewClientCheck(); /* See if there is another client wanting to play */ UpdateClients(); // CheckReady(); - if (time(NULL) > statsTime) { + if (time(NULL) > statsTime) + { SendStatsToClients(); statsTime = time(NULL); } @@ -71,7 +80,8 @@ void StepManiaLanServer::ServerUpdate() { } } -void StepManiaLanServer::UpdateClients() { +void StepManiaLanServer::UpdateClients() +{ /* Go through all the clients and check to see if it is being used. If so then try to get a backet and parse the data. */ for (int x = 0; x < NUMBERCLIENTS; x++) @@ -80,7 +90,8 @@ void StepManiaLanServer::UpdateClients() { ParseData(Packet, x); } -GameClient::GameClient() { +GameClient::GameClient() +{ Used = 0; GotStartRequest = 0; clientSocket.blocking = 0; @@ -94,7 +105,8 @@ GameClient::GameClient() { wasIngame = false; } -int GameClient::GetData(PacketFunctions &Packet) { +int GameClient::GetData(PacketFunctions& Packet) +{ int length = -1; CheckConnection(); Packet.ClearPacket(); @@ -102,9 +114,11 @@ int GameClient::GetData(PacketFunctions &Packet) { return length; } -void StepManiaLanServer::ParseData(PacketFunctions &Packet, int clientNum) { +void StepManiaLanServer::ParseData(PacketFunctions& Packet, int clientNum) +{ int command = Packet.Read1(); - switch (command) { + switch (command) + { case 0: // No Operation SendValue(129, clientNum); @@ -153,7 +167,8 @@ void StepManiaLanServer::ParseData(PacketFunctions &Packet, int clientNum) { } } -void StepManiaLanServer::Hello(PacketFunctions &Packet, int clientNum) { +void StepManiaLanServer::Hello(PacketFunctions& Packet, int clientNum) +{ int ClientVersion = Packet.Read1(); CString build = Packet.ReadNT(); @@ -171,22 +186,26 @@ void StepManiaLanServer::Hello(PacketFunctions &Packet, int clientNum) { } -void GameClient::StyleUpdate(PacketFunctions &Packet) { +void GameClient::StyleUpdate(PacketFunctions& Packet) +{ int playernumber = 0; Player[0].name = Player[1].name = ""; twoPlayers = Packet.Read1()-1; - for (int x = 0; x < twoPlayers+1; x++) { + for (int x = 0; x < twoPlayers+1; x++) + { playernumber = Packet.Read1(); Player[playernumber].name = Packet.ReadNT(); } } -void GameClient::SetClientVersion(int ver, CString b) { +void GameClient::SetClientVersion(int ver, const CString& b) +{ version = ver; build = b; } -void GameClient::StartRequest(PacketFunctions &Packet) { +void GameClient::StartRequest(PacketFunctions& Packet) +{ int firstbyte = Packet.Read1(); int secondbyte = Packet.Read1(); int thirdbyte = Packet.Read1(); @@ -205,31 +224,34 @@ void GameClient::StartRequest(PacketFunctions &Packet) { gameInfo.artist = Packet.ReadNT(); gameInfo.course = Packet.ReadNT(); - for (int x = 0; x < 2; x++) { + for (int x = 0; x < 2; ++x) + { Player[x].score = 0; Player[x].combo = 0; Player[x].projgrade = 0; Player[x].maxCombo = 0; - memset((void*)Player[x].steps, 0, sizeof(int)*9); + memset(Player[x].steps, 0, sizeof(int)*9); } GotStartRequest = true; // InGame = true; } -void StepManiaLanServer::CheckReady() { +void StepManiaLanServer::CheckReady() +{ bool canStart = true; int x; //Only check clients that are starting (after ScreenNetMusicSelect before InGame). - for (x = 0; (x < NUMBERCLIENTS)&&(canStart == true); x++) - if (Client[x].Used == true) + for (x = 0; (x < NUMBERCLIENTS)&& canStart; ++x) + if (Client[x].Used) if (Client[x].isStarting) - if (Client[x].GotStartRequest == false) + if (!Client[x].GotStartRequest) canStart = false; - if (canStart == true) { + if (canStart) + { //(Test this) //For whatever reason we need to pause in a way //that will not use a lot of CPU. @@ -238,13 +260,16 @@ void StepManiaLanServer::CheckReady() { usleep ( 2000000 ); //Only start clients waiting for start between ScreenNetMusicSelect and game. - for (x = 0; x < NUMBERCLIENTS; x++) { - if (Client[x].Used == true) - if (Client[x].isStarting) { + for (x = 0; x < NUMBERCLIENTS; ++x) + { + if (Client[x].Used) + if (Client[x].isStarting) + { Client[x].clientSocket.blocking = true; SendValue(131, x); Client[x].GotStartRequest = false; - if (Client[x].startPosition == 1) { + if (Client[x].startPosition == 1) + { Client[x].isStarting = false; Client[x].InGame = true; //After we start the clients, clear each client's hasSong. @@ -257,7 +282,8 @@ void StepManiaLanServer::CheckReady() { } -void StepManiaLanServer::GameOver(PacketFunctions &Packet, int clientNum) { +void StepManiaLanServer::GameOver(PacketFunctions& Packet, int clientNum) +{ bool allOver = true; int x; @@ -265,37 +291,39 @@ void StepManiaLanServer::GameOver(PacketFunctions &Packet, int clientNum) { Client[clientNum].InGame = false; Client[clientNum].wasIngame = true; - for (x = 0; (x < NUMBERCLIENTS)&&(allOver == true); x++) - if (Client[x].Used == true) - if ((Client[x].InGame == true)) + for (x = 0; (x < NUMBERCLIENTS)&&allOver ; ++x) + if (Client[x].Used) + if (Client[x].InGame) allOver = false; //Wait untill everyone is done before sending - if (allOver) { + if (allOver) + { numPlayers = SortStats(playersPtr); Reply.ClearPacket(); Reply.Write1( 4+128 ); Reply.Write1( (uint8_t) numPlayers ); - for (x = 0; x < numPlayers; x++) + for (x = 0; x < numPlayers; ++x) Reply.Write1((uint8_t)playersPtr[x]->PlayerID); - for (x = 0; x < numPlayers; x++) + for (x = 0; x < numPlayers; ++x) Reply.Write4(playersPtr[x]->score); - for (x = 0; x < numPlayers; x++) + for (x = 0; x < numPlayers; ++x) Reply.Write1( (uint8_t) playersPtr[x]->projgrade ); - for (x = 0; x < numPlayers; x++) + for (x = 0; x < numPlayers; ++x) Reply.Write1( (uint8_t) playersPtr[x]->diff ); - for (int y = 6; y >= 1; y--) - for (x = 0; x < numPlayers; x++) + for (int y = 6; y >= 1; --y) + for (x = 0; x < numPlayers; ++x) Reply.Write2( (uint16_t) playersPtr[x]->steps[y] ); - for (x = 0; x < numPlayers; x++) + for (x = 0; x < numPlayers; ++x) Reply.Write2( (uint16_t) playersPtr[x]->steps[8] ); //Tack on OK - for (x = 0; x < numPlayers; x++) + for (x = 0; x < numPlayers; ++x) Reply.Write2( (uint16_t) playersPtr[x]->maxCombo ); - for (x = 0; x < numPlayers; x++) + for (x = 0; x < numPlayers; ++x) Reply.WriteNT( playersPtr[x]->options ); - for (x = 0; x < NUMBERCLIENTS; x++) - if(Client[x].wasIngame) { + for (x = 0; x < NUMBERCLIENTS; ++x) + if(Client[x].wasIngame) + { SendNetPacket(x, Reply); Client[x].wasIngame = false; } @@ -304,36 +332,40 @@ void StepManiaLanServer::GameOver(PacketFunctions &Packet, int clientNum) { } } -void StepManiaLanServer::AssignPlayerIDs() { +void StepManiaLanServer::AssignPlayerIDs() +{ int counter = 0; //Future: Figure out how to do dynamic numbering. - for (int x = 0; x < NUMBERCLIENTS; x++) - for(int y = 0; y < 2; y++) + for (int x = 0; x < NUMBERCLIENTS; ++x) + for(int y = 0; y < 2; ++y) Client[x].Player[y].PlayerID = counter++; } -int StepManiaLanServer::SortStats(LanPlayer *playersPtr[]) { +int StepManiaLanServer::SortStats(LanPlayer *playersPtr[]) +{ int counter = 0; LanPlayer *tmp; StatsNameChange = false; //Set it to no name so stats will not send if there is not a change bool allZero = true; //Populate with in game players only - for (int x = 0; x < NUMBERCLIENTS; x++) - if (Client[x].Used == true) + for (int x = 0; x < NUMBERCLIENTS; ++x) + if (Client[x].Used) if (Client[x].InGame||Client[x].wasIngame) - for (int y = 0; y < 2; y++) + for (int y = 0; y < 2; ++y) if (Client[x].IsPlaying(y)) playersPtr[counter++] = &Client[x].Player[y]; - for (int x = 0; x < counter; x++) { + for (int x = 0; x < counter; ++x) + { //See if all the players have zero. Used to send names if everyone is 0 - if ((playersPtr[x]->score > 0)&&(allZero == true)) + if ((playersPtr[x]->score > 0) && allZero) allZero = false; if ((x+1) < counter) - if ((playersPtr[x]->score) < (playersPtr[x+1]->score)) { + if ((playersPtr[x]->score) < (playersPtr[x+1]->score)) + { tmp = playersPtr[x]; playersPtr[x] = playersPtr[x+1]; playersPtr[x+1] = tmp; @@ -344,21 +376,22 @@ int StepManiaLanServer::SortStats(LanPlayer *playersPtr[]) { } //If there are players all at 0, the name lsit won't be updated //this make sure it is sent to the server eventually - if ((StatsNameChange == false)&&(allZero == true)) + if (!StatsNameChange && allZero) StatsNameChange = true; return counter; } -void StepManiaLanServer::SendStatsToClients() { +void StepManiaLanServer::SendStatsToClients() +{ int x; numPlayers = SortStats(playersPtr); //Return number of players //If there was a chagne in the name data, send it to the clients. //Used to save bandwidth and some processing time. -// if (StatsNameChange) { - + if (StatsNameChange) + { /* Write and Send name packet */ Reply.ClearPacket(); Reply.Write1(133); @@ -367,11 +400,11 @@ void StepManiaLanServer::SendStatsToClients() { StatsNameColumn(Reply, playersPtr, numPlayers); //Send to in game clients only. - for (x = 0; x < NUMBERCLIENTS; x++) - if (Client[x].InGame == true) + for (x = 0; x < NUMBERCLIENTS; ++x) + if (Client[x].InGame) SendNetPacket(x, Reply); -// } + } /* Write and send Combo packet */ Reply.ClearPacket(); @@ -382,8 +415,8 @@ void StepManiaLanServer::SendStatsToClients() { StatsComboColumn(Reply, playersPtr, numPlayers); //Send to in game clients only. - for (x = 0; x < NUMBERCLIENTS; x++) - if (Client[x].InGame == true) + for (x = 0; x < NUMBERCLIENTS; ++x) + if (Client[x].InGame) SendNetPacket(x, Reply); @@ -398,36 +431,41 @@ void StepManiaLanServer::SendStatsToClients() { StatsProjgradeColumn(Reply, playersPtr, numPlayers); //Send to in game clients only. - for (x = 0; x < NUMBERCLIENTS; x++) - if (Client[x].InGame == true) + for (x = 0; x < NUMBERCLIENTS; ++x) + if (Client[x].InGame) SendNetPacket(x, Reply); } -void StepManiaLanServer::SendNetPacket(int client, PacketFunctions &Packet) { +void StepManiaLanServer::SendNetPacket(int client, PacketFunctions& Packet) +{ /* If there is a connected client where we want to send then do so */ - if (Client[client].Used == true) + if (Client[client].Used) Client[client].clientSocket.SendPack((char*)Packet.Data, Packet.Position); } -void StepManiaLanServer::StatsNameColumn(PacketFunctions &data, LanPlayer *playersPtr[], int numPlayers) { +void StepManiaLanServer::StatsNameColumn(PacketFunctions &data, LanPlayer *playersPtr[], int numPlayers) +{ CString numname; - for (int x = 0; x < numPlayers; x++) + for (int x = 0; x < numPlayers; ++x) data.Write1( (uint8_t) playersPtr[x]->PlayerID ); } -void StepManiaLanServer::StatsComboColumn(PacketFunctions &data, LanPlayer *playersPtr[], int numPlayers) { - for( int x = 0; x < numPlayers; x++ ) +void StepManiaLanServer::StatsComboColumn(PacketFunctions &data, LanPlayer *playersPtr[], int numPlayers) +{ + for( int x = 0; x < numPlayers; ++x ) data.Write2( (uint16_t) playersPtr[x]->combo); } -void StepManiaLanServer::StatsProjgradeColumn(PacketFunctions &data, LanPlayer *playersPtr[], int numPlayers) { - for( int x = 0; x < numPlayers; x++ ) +void StepManiaLanServer::StatsProjgradeColumn(PacketFunctions& data, LanPlayer *playersPtr[], int numPlayers) +{ + for( int x = 0; x < numPlayers; ++x ) data.Write1( (uint8_t) playersPtr[x]->projgrade ); } -bool GameClient::IsPlaying(int x) { +bool GameClient::IsPlaying(int x) +{ /* If the feet setting is above 0, there must be a player. */ if (Player[x].feet > 0) return true; @@ -435,7 +473,8 @@ bool GameClient::IsPlaying(int x) { return false; } -void GameClient::UpdateStats(PacketFunctions &Packet) { +void GameClient::UpdateStats(PacketFunctions& Packet) +{ /* Get the Stats form a packet */ char firstbyte = Packet.Read1(); char secondbyte = Packet.Read1(); @@ -454,7 +493,8 @@ void GameClient::UpdateStats(PacketFunctions &Packet) { Player[pID].steps[Player[pID].currstep]++; } -void StepManiaLanServer::NewClientCheck() { +void StepManiaLanServer::NewClientCheck() +{ /* Find the first available empty client. Then stick a new connection in that client socket.*/ int CurrentEmptyClient = FindEmptyClient(); @@ -465,11 +505,13 @@ void StepManiaLanServer::NewClientCheck() { } -void StepManiaLanServer::SendValue(Uint8 value, int clientNum) { +void StepManiaLanServer::SendValue(Uint8 value, int clientNum) +{ Client[clientNum].clientSocket.SendPack((char*)&value, sizeof(Uint8)); } -void StepManiaLanServer::RelayChat(PacketFunctions &Packet, int clientNum) { +void StepManiaLanServer::RelayChat(PacketFunctions& Packet, int clientNum) +{ Reply.ClearPacket(); CString message = ""; @@ -489,12 +531,15 @@ void StepManiaLanServer::RelayChat(PacketFunctions &Packet, int clientNum) { SendToAllClients(Reply); } -void StepManiaLanServer::SelectSong(PacketFunctions &Packet, int clientNum) { +void StepManiaLanServer::SelectSong(PacketFunctions& Packet, int clientNum) +{ int use = Packet.Read1(); CString message; - if (use == 2) { - if (clientNum == 0) { + if (use == 2) + { + if (clientNum == 0) + { SecondSameSelect = false; CurrentSongInfo.title = Packet.ReadNT(); @@ -509,7 +554,7 @@ void StepManiaLanServer::SelectSong(PacketFunctions &Packet, int clientNum) { Reply.WriteNT(CurrentSongInfo.subtitle); //Only send data to clients currently in ScreenNetMusicSelect - for (int x = 0; x < NUMBERCLIENTS; x++) + for (int x = 0; x < NUMBERCLIENTS; ++x) if (Client[x].inNetMusicSelect) SendNetPacket(x, Reply); // SendToAllClients(Reply); @@ -520,7 +565,8 @@ void StepManiaLanServer::SelectSong(PacketFunctions &Packet, int clientNum) { if (strcmp(CurrentSongInfo.artist, LastSongInfo.artist) == 0) SecondSameSelect = true; - if (SecondSameSelect == false) { + if (!SecondSameSelect) + { LastSongInfo.title = CurrentSongInfo.title; LastSongInfo.artist = CurrentSongInfo.artist; LastSongInfo.subtitle = CurrentSongInfo.subtitle; @@ -531,7 +577,9 @@ void StepManiaLanServer::SelectSong(PacketFunctions &Packet, int clientNum) { ServerChat(message); } - } else { + } + else + { message = servername; message += ": You do not have permission to pick a song."; Reply.ClearPacket(); @@ -541,14 +589,16 @@ void StepManiaLanServer::SelectSong(PacketFunctions &Packet, int clientNum) { } } - if (use == 1) { + if (use == 1) + { //If user dosn't have song Client[clientNum].hasSong = false; message = servername; message += ": "; message += Client[clientNum].Player[0].name; - if (Client[clientNum].twoPlayers) { + if (Client[clientNum].twoPlayers) + { message += "&"; message += Client[clientNum].Player[1].name; } @@ -564,7 +614,8 @@ void StepManiaLanServer::SelectSong(PacketFunctions &Packet, int clientNum) { Client[clientNum].hasSong = true; //Only play if everyone has the same song and the host has select the same song twice. - if ( CheckHasSongState() && SecondSameSelect && (clientNum == 0) ) { + if ( CheckHasSongState() && SecondSameSelect && (clientNum == 0) ) + { Reply.ClearPacket(); Reply.Write1(136); Reply.Write1(2); @@ -579,7 +630,8 @@ void StepManiaLanServer::SelectSong(PacketFunctions &Packet, int clientNum) { //Only send data to clients currently in ScreenNetMusicSelect for (int x = 0; x < NUMBERCLIENTS; x++) - if (Client[x].inNetMusicSelect) { + if (Client[x].inNetMusicSelect) + { SendNetPacket(x, Reply); //Designate the client is starting, //after ScreenNetMusicSelect but before game play (InGame). @@ -590,76 +642,86 @@ void StepManiaLanServer::SelectSong(PacketFunctions &Packet, int clientNum) { } } -bool StepManiaLanServer::CheckHasSongState() { - for (int x = 0; x < NUMBERCLIENTS; x++) - if (Client[x].Used == true) +bool StepManiaLanServer::CheckHasSongState() +{ + for (int x = 0; x < NUMBERCLIENTS; ++x) + if (Client[x].Used) if (Client[x].inNetMusicSelect) - if (Client[x].hasSong == false) + if (!Client[x].hasSong) return false; return true; } -void StepManiaLanServer::ClearHasSong() { - for (int x = 0; x < NUMBERCLIENTS; x++) - if (Client[x].Used == true) +void StepManiaLanServer::ClearHasSong() +{ + for (int x = 0; x < NUMBERCLIENTS; ++x) + if (Client[x].Used) Client[x].hasSong = false; } -void StepManiaLanServer::SendToAllClients(PacketFunctions &Packet) { - for (int x = 0; x < NUMBERCLIENTS; x++) +void StepManiaLanServer::SendToAllClients(PacketFunctions& Packet) +{ + for (int x = 0; x < NUMBERCLIENTS; ++x) SendNetPacket(x, Packet); } -void StepManiaLanServer::ServerChat(CString message) { +void StepManiaLanServer::ServerChat(const CString& message) +{ Reply.ClearPacket(); Reply.Write1(135); Reply.WriteNT(message); SendToAllClients(Reply); } -int StepManiaLanServer::FindEmptyClient() { +int StepManiaLanServer::FindEmptyClient() +{ //Look at Used flag, if zero then it's an empty client (return client index, -1 if none). - for (int x = 0; x < NUMBERCLIENTS; x++) + for (int x = 0; x < NUMBERCLIENTS; ++x) if (Client[x].Used == 0) return x; return -1; } -void GameClient::CheckConnection() { +void GameClient::CheckConnection() +{ //If there is an error close the socket. - if (clientSocket.IsError()) { + if (clientSocket.IsError()) + { clientSocket.close(); Used = GotStartRequest = hasSong = InGame = inNetMusicSelect = false; Player[0].name = Player[1].name = ""; } } -void StepManiaLanServer::MoveClientToHost() { - if (Client[ClientHost].Used == false) - for (int x = 1; x < NUMBERCLIENTS; x++) - if (Client[x].Used == true) { +void StepManiaLanServer::MoveClientToHost() +{ + if (!Client[ClientHost].Used) + for (int x = 1; x < NUMBERCLIENTS; ++x) + if (Client[x].Used) + { ClientHost = x; x = NUMBERCLIENTS+1; } } -void StepManiaLanServer::SendUserList() { +void StepManiaLanServer::SendUserList() +{ Reply.ClearPacket(); Reply.Write1(137); Reply.Write1(NUMBERCLIENTS*2); Reply.Write1(NUMBERCLIENTS*2); - for (int x = 0; x < NUMBERCLIENTS; x++) { - for (int y = 0; y < 2; y++) { - if (Client[x].Player[y].name.length() == 0) { + for (int x = 0; x < NUMBERCLIENTS; ++x) + { + for (int y = 0; y < 2; ++y) + { + if (Client[x].Player[y].name.length() == 0) Reply.Write1(0); - } else { + else Reply.Write1(1); - } - Reply.WriteNT(Client[x].Player[y].name); } } @@ -667,44 +729,28 @@ void StepManiaLanServer::SendUserList() { SendToAllClients(Reply); } -void StepManiaLanServer::ScreenNetMusicSelectStatus(PacketFunctions &Packet, int clientNum) { - int code = Packet.Read1()%2; +void StepManiaLanServer::ScreenNetMusicSelectStatus(PacketFunctions& Packet, int clientNum) +{ + LOG->Info("SNMS Change"); CString message = servername; message += ": "; - if (code%2 == 1) { + if (Packet.Read1() == 1) + { Client[clientNum].inNetMusicSelect = true; - } else { - Client[clientNum].inNetMusicSelect = false; + message += Client[clientNum].Player[0].name; + if (Client[clientNum].twoPlayers) + message += "&"; + message += Client[clientNum].Player[1].name; + message += " entered the game."; } - switch (code) { - case 0: + else + { + Client[clientNum].inNetMusicSelect = false; message += Client[clientNum].Player[0].name; if (Client[clientNum].twoPlayers) message += "&"; message += Client[clientNum].Player[1].name; - message += " exited the Music Select."; - break; - case 1: - message += Client[clientNum].Player[0].name; - if (Client[clientNum].twoPlayers) - message += "&"; - message += Client[clientNum].Player[1].name; - message += " entered the Music Select."; - break; - case 2: - message += Client[clientNum].Player[0].name; - if (Client[clientNum].twoPlayers) - message += "&"; - message += Client[clientNum].Player[1].name; - message += " entered from options."; - break; - case 3: - message += Client[clientNum].Player[0].name; - if (Client[clientNum].twoPlayers) - message += "&"; - message += Client[clientNum].Player[1].name; - message += " exited to options."; - break; + message += " left the game."; } ServerChat(message); }