rnd-20031213-1-src
[rocksndiamonds.git] / src / network.c
index bd408a1ec6b647be1d79afc9247345e83243df03..73a13b1f8ab3032962e7b46a57fa048452fce944 100644 (file)
@@ -1,19 +1,20 @@
 /***********************************************************
-*  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
+* Rocks'n'Diamonds -- McDuffin Strikes Back!               *
 *----------------------------------------------------------*
-*  (c) 1995-98 Artsoft Entertainment                       *
-*              Holger Schemel                              *
-*              Oststrasse 11a                              *
-*              33604 Bielefeld                             *
-*              phone: ++49 +521 290471                     *
-*              email: aeglos@valinor.owl.de                *
+* (c) 1995-2002 Artsoft Entertainment                      *
+*               Holger Schemel                             *
+*               Detmolder Strasse 189                      *
+*               33604 Bielefeld                            *
+*               Germany                                    *
+*               e-mail: info@artsoft.org                   *
 *----------------------------------------------------------*
-*  network.c                                               *
+* network.c                                                *
 ***********************************************************/
 
-#ifndef MSDOS
+#include "libgame/platform.h"
+
+#if defined(PLATFORM_UNIX)
 
-#include <unistd.h>
 #include <signal.h>
 #include <sys/time.h>
 #include <sys/wait.h>
 #include <arpa/inet.h>
 #include <netdb.h>
 
+#include "libgame/libgame.h"
+
 #include "network.h"
 #include "netserv.h"
 #include "game.h"
 #include "tape.h"
 #include "files.h"
 #include "tools.h"
-#include "buttons.h"
 #include "screens.h"
-#include "misc.h"
-
-#define MAX_PLAYER_NAME_LEN 14
 
 struct NetworkClientPlayerInfo
 {
   byte nr;
-  char name[MAX_PLAYER_NAME_LEN + 2];
+  char name[MAX_PLAYER_NAME_LEN + 1];
   struct NetworkClientPlayerInfo *next;
 };
 
@@ -101,7 +100,7 @@ char *getNetworkPlayerName(int player_nr)
   else if (player_nr == first_player.nr)
     return("you");
   else
-    for (player=&first_player; player; player=player->next)
+    for (player = &first_player; player; player = player->next)
       if (player->nr == player_nr && player->name && strlen(player->name))
        return(player->name);
 
@@ -174,7 +173,7 @@ boolean ConnectToServer(char *hostname, int port)
   StartNetworkServer(port);
 
   /* wait for server to start up and try connecting several times */
-  for (i=0; i<6; i++)
+  for (i = 0; i < 6; i++)
   {
     Delay(500);                /* wait 500 ms == 0.5 seconds */
     close(sfd);
@@ -225,20 +224,23 @@ void SendToServer_StartPlaying()
 {
   unsigned long new_random_seed = InitRND(NEW_RANDOMIZE);
 
+  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)(leveldir_nr >> 8);
-  buffer[5] = (byte)(leveldir_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(&buffer[10], leveldir[leveldir_nr].name);
+  strcpy((char *)&buffer[10], leveldir_current->identifier);
 
-  SendBufferToServer(10 + strlen(leveldir[leveldir_nr].name)+1);
+  SendBufferToServer(10 + strlen(leveldir_current->identifier) + 1);
 }
 
 void SendToServer_PausePlaying()
@@ -264,7 +266,7 @@ void SendToServer_StopPlaying()
 
 void SendToServer_MovePlayer(byte player_action)
 {
-  buffer[1] = OP_MOVE_FIGURE;
+  buffer[1] = OP_MOVE_PLAYER;
   buffer[2] = player_action;
 
   SendBufferToServer(3);
@@ -364,7 +366,7 @@ static void Handle_OP_PLAYER_NAME(unsigned int len)
   buffer[len] = 0;
   Error(ERR_NETWORK_CLIENT, "client %d calls itself \"%s\"",
        buffer[0], &buffer[2]);
-  strncpy(player->name, &buffer[2], MAX_PLAYER_NAME_LEN);
+  strncpy(player->name, (char *)&buffer[2], MAX_PLAYER_NAME_LEN);
 }
 
 static void Handle_OP_PLAYER_CONNECTED()
@@ -376,7 +378,7 @@ static void Handle_OP_PLAYER_CONNECTED()
   printf("OP_PLAYER_CONNECTED: %d\n", new_client_nr);
   Error(ERR_NETWORK_CLIENT, "new client %d connected", new_client_nr);
 
-  for (player=&first_player; player; player=player->next)
+  for (player = &first_player; player; player = player->next)
   {
     if (player->nr == new_client_nr)
       Error(ERR_EXIT, "multiplayer server sent duplicate player id");
@@ -403,7 +405,7 @@ static void Handle_OP_PLAYER_DISCONNECTED()
   Error(ERR_NETWORK_CLIENT, "client %d (%s) disconnected",
        player_nr, getNetworkPlayerName(buffer[0]));
 
-  for (player=&first_player; player; player=player->next)
+  for (player = &first_player; player; player = player->next)
     if (player->next == player_disconnected)
       player->next = player_disconnected->next;
   free(player_disconnected);
@@ -411,25 +413,34 @@ static void Handle_OP_PLAYER_DISCONNECTED()
 
 static void Handle_OP_START_PLAYING()
 {
-  int new_level_nr, new_leveldir_nr;
+  LevelDirTree *new_leveldir;
+  int new_level_nr;
+  int dummy;                           /* !!! HAS NO MEANING ANYMORE !!! */
   unsigned long new_random_seed;
-  unsigned char *new_leveldir_name;
+  char *new_leveldir_identifier;
 
   new_level_nr = (buffer[2] << 8) + buffer[3];
-  new_leveldir_nr = (buffer[4] << 8) + buffer[5];
+  dummy = (buffer[4] << 8) + buffer[5];
   new_random_seed =
     (buffer[6] << 24) | (buffer[7] << 16) | (buffer[8] << 8) | (buffer[9]);
-  new_leveldir_name = &buffer[10];
+  new_leveldir_identifier = (char *)&buffer[10];
+
+  new_leveldir = getTreeInfoFromIdentifier(leveldir_first,
+                                          new_leveldir_identifier);
+  if (new_leveldir == NULL)
+  {
+    Error(ERR_WARN, "no such level identifier: '%s'", new_leveldir_identifier);
+
+    new_leveldir = leveldir_first;
+    Error(ERR_WARN, "using default level set: '%s'", new_leveldir->identifier);
+  }
 
   printf("OP_START_PLAYING: %d\n", buffer[0]);
   Error(ERR_NETWORK_CLIENT,
-       "client %d starts game [level %d from levedir %d (%s)]\n",
-       buffer[0], new_level_nr, new_leveldir_nr, new_leveldir_name);
-
-  if (strcmp(leveldir[new_leveldir_nr].name, new_leveldir_name) != 0)
-    Error(ERR_WARN, "no such level directory: '%s'",new_leveldir_name);
+       "client %d starts game [level %d from level identifier '%s']\n",
+       buffer[0], new_level_nr, new_leveldir->identifier);
 
-  leveldir_nr = new_leveldir_nr;
+  leveldir_current = new_leveldir;
   level_nr = new_level_nr;
 
   TapeErase();
@@ -444,7 +455,7 @@ static void Handle_OP_START_PLAYING()
 
   InitRND(new_random_seed);
 
-  game_status = PLAYING;
+  game_status = GAME_MODE_PLAYING;
   InitGame();
 }
 
@@ -471,11 +482,11 @@ static void Handle_OP_STOP_PLAYING()
   printf("OP_STOP_PLAYING: %d\n", buffer[0]);
   Error(ERR_NETWORK_CLIENT, "client %d stops game", buffer[0]);
 
-  game_status = MAINMENU;
+  game_status = GAME_MODE_MAIN;
   DrawMainMenu();
 }
 
-static void Handle_OP_MOVE_FIGURE(unsigned int len)
+static void Handle_OP_MOVE_PLAYER(unsigned int len)
 {
   int server_frame_counter;
   int i;
@@ -495,7 +506,7 @@ static void Handle_OP_MOVE_FIGURE(unsigned int len)
   }
 
   /* copy valid player actions */
-  for (i=0; i<MAX_PLAYERS; i++)
+  for (i = 0; i < MAX_PLAYERS; i++)
     stored_player[i].effective_action =
       (i < len - 6 && stored_player[i].active ? buffer[6 + i] : 0);
 
@@ -558,8 +569,8 @@ static void HandleNetworkingMessages()
        Handle_OP_STOP_PLAYING();
        break;
 
-      case OP_MOVE_FIGURE:
-       Handle_OP_MOVE_FIGURE(message_length);
+      case OP_MOVE_PLAYER:
+       Handle_OP_MOVE_PLAYER(message_length);
        break;
 
       case OP_BROADCAST_MESSAGE:
@@ -607,4 +618,4 @@ void HandleNetworking()
   }
 }
 
-#endif /* !MSDOS */
+#endif /* PLATFORM_UNIX */