+
+ rfds = SDLNet_AllocSocketSet(1);
+
+ if (hostname)
+ {
+ SDLNet_ResolveHost(&ip, hostname, port);
+
+ if (ip.host == INADDR_NONE)
+ Error(ERR_EXIT, "cannot locate host '%s'", hostname);
+ else
+ server_host = SDLNet_Read32(&ip.host);
+ }
+ else
+ {
+ // if no hostname was given and no network server was auto-detected in the
+ // local network, try to connect to a network server at the local host
+ if (server_host == 0)
+ server_host = 0x7f000001; /* 127.0.0.1 */
+
+ SDLNet_Write32(server_host, &ip.host);
+ SDLNet_Write16(port, &ip.port);
+ }
+
+ Error(ERR_DEBUG, "trying to connect to network server at %d.%d.%d.%d ...",
+ (server_host >> 24) & 0xff,
+ (server_host >> 16) & 0xff,
+ (server_host >> 8) & 0xff,
+ (server_host >> 0) & 0xff);
+
+ sfd = SDLNet_TCP_Open(&ip);
+
+ if (sfd)
+ {
+ SDLNet_TCP_AddSocket(rfds, sfd);
+ return TRUE;
+ }
+ else
+ {
+ printf("SDLNet_TCP_Open(): %s\n", SDLNet_GetError());
+ }
+
+ if (hostname) /* connect to specified server failed */
+ return FALSE;
+
+ printf("No rocksndiamonds server on localhost -- starting up one ...\n");
+ StartNetworkServer(port);
+
+ /* wait for server to start up and try connecting several times */
+ for (i = 0; i < 6; i++)
+ {
+ Delay(500); /* wait 500 ms == 0.5 seconds */
+
+ if ((sfd = SDLNet_TCP_Open(&ip))) /* connected */
+ {
+ SDLNet_TCP_AddSocket(rfds, sfd);
+ return TRUE;
+ }
+ }
+
+ /* when reaching this point, connect to newly started server has failed */
+ return FALSE;
+}
+
+void SendToServer_PlayerName(char *player_name)
+{
+ int len_player_name = strlen(player_name);
+
+ buffer[1] = OP_PLAYER_NAME;
+ memcpy(&buffer[2], player_name, len_player_name);
+ SendBufferToServer(2 + len_player_name);
+ Error(ERR_NETWORK_CLIENT, "you set your player name to \"%s\"", player_name);
+}
+
+void SendToServer_ProtocolVersion()
+{
+ buffer[1] = OP_PROTOCOL_VERSION;
+ buffer[2] = PROTOCOL_VERSION_1;
+ buffer[3] = PROTOCOL_VERSION_2;
+ buffer[4] = PROTOCOL_VERSION_3;
+
+ SendBufferToServer(5);
+}
+
+void SendToServer_NrWanted(int nr_wanted)
+{
+ buffer[1] = OP_NUMBER_WANTED;
+ buffer[2] = nr_wanted;
+
+ SendBufferToServer(3);
+}
+
+void SendToServer_StartPlaying()
+{
+ unsigned int new_random_seed = InitRND(level.random_seed);
+
+ int dummy = 0; /* !!! HAS NO MEANING ANYMORE !!! */
+ /* the name of the level must be enough */
+
+ buffer[1] = OP_START_PLAYING;
+ buffer[2] = (byte)(level_nr >> 8);
+ buffer[3] = (byte)(level_nr & 0xff);
+ buffer[4] = (byte)(dummy >> 8);
+ buffer[5] = (byte)(dummy & 0xff);
+
+ buffer[6] = (unsigned char)((new_random_seed >> 24) & 0xff);
+ buffer[7] = (unsigned char)((new_random_seed >> 16) & 0xff);
+ buffer[8] = (unsigned char)((new_random_seed >> 8) & 0xff);
+ buffer[9] = (unsigned char)((new_random_seed >> 0) & 0xff);
+
+ strcpy((char *)&buffer[10], leveldir_current->identifier);
+
+ SendBufferToServer(10 + strlen(leveldir_current->identifier) + 1);
+}
+
+void SendToServer_PausePlaying()
+{
+ buffer[1] = OP_PAUSE_PLAYING;
+
+ SendBufferToServer(2);
+}
+
+void SendToServer_ContinuePlaying()
+{
+ buffer[1] = OP_CONTINUE_PLAYING;
+
+ SendBufferToServer(2);