rnd-20031129-3-src
[rocksndiamonds.git] / src / netserv.c
index 6a2479e53df35a2f638533ab85f57065701029bf..71834c3b1f17dbc8be3a778149e0db9ea569570e 100644 (file)
@@ -1,17 +1,17 @@
 /***********************************************************
-*  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                                                *
 ***********************************************************/
 
-#include "libgame/libgame.h"
+#include "libgame/platform.h"
 
 #if defined(PLATFORM_UNIX)
 
 #include <signal.h>
 #include <sys/socket.h>
 #include <errno.h>
-#include <string.h>
 #include <netinet/in.h>
 #include <netinet/tcp.h>
 #include <arpa/inet.h>
 #include <netdb.h>
 
-#if 0
 #include "libgame/libgame.h"
-#endif
 
 #include "netserv.h"
 
@@ -92,8 +89,9 @@ static void broadcast(struct NetworkServerPlayerInfo *except,
 
   realbuffer[0] = realbuffer[1] = realbuffer[2] = 0;
   realbuffer[3] = (unsigned char)len;
-  for (player=first_player; player; player=player->next)
-    if (player != except && (player->active || !activeonly) && player->introduced)
+  for (player = first_player; player; player = player->next)
+    if (player != except && player->introduced &&
+       (player->active || !activeonly))
       addtobuffer(player, realbuffer, 4 + len);
 }
 
@@ -116,7 +114,7 @@ static void RemovePlayer(struct NetworkServerPlayerInfo *player)
     first_player = player->next;
   else
   {
-    for (v=first_player; v; v=v->next)
+    for (v = first_player; v; v = v->next)
     {
       if (v->next && v->next == player)
       {
@@ -152,6 +150,7 @@ static void AddPlayer(int fd)
 {
   struct NetworkServerPlayerInfo *player, *v;
   unsigned char nxn;
+  boolean again = TRUE;
 
   player = checked_malloc(sizeof (struct NetworkServerPlayerInfo));
 
@@ -169,9 +168,28 @@ static void AddPlayer(int fd)
 
   nxn = 1;
 
+#if 1
+  while (again)
+  {
+    again = FALSE;
+    v = player->next;
+
+    while (v)
+    {
+      if (v->number == nxn)
+      {
+       nxn++;
+
+       again = TRUE;
+       break;
+      }
+      v = v->next;
+    }
+  }
+#else
  again:
   v = player->next;
-  while(v)
+  while (v)
   {
     if (v->number == nxn)
     {
@@ -180,6 +198,7 @@ static void AddPlayer(int fd)
     }
     v = v->next;
   }
+#endif
 
   player->number = nxn;
   if (options.verbose)
@@ -236,7 +255,7 @@ static void Handle_OP_NUMBER_WANTED(struct NetworkServerPlayerInfo *player)
       Error(ERR_NETWORK_SERVER, "client %d (%s) wants to switch to # %d",
            player->number, player->player_name, nr_wanted);
 
-  for (v=first_player; v; v=v->next)
+  for (v = first_player; v; v = v->next)
   {
     if (v->number == nr_wanted)
     {
@@ -284,7 +303,7 @@ static void Handle_OP_PLAYER_NAME(struct NetworkServerPlayerInfo *player,
     len=16;
   memcpy(player->player_name, &buffer[2], len-2);
   player->player_name[len-2] = 0;
-  for (i=0; i<len-2; i++)
+  for (i = 0; i < len - 2; i++)
   {
     if (player->player_name[i] < ' ' || 
        ((unsigned char)(player->player_name[i]) > 0x7e &&
@@ -310,7 +329,7 @@ static void Handle_OP_PLAYER_NAME(struct NetworkServerPlayerInfo *player,
 
   if (!player->introduced)
   {
-    for (v=first_player; v; v=v->next)
+    for (v = first_player; v; v = v->next)
     {
       if (v != player && v->introduced)
       {
@@ -339,7 +358,7 @@ static void Handle_OP_START_PLAYING(struct NetworkServerPlayerInfo *player)
          (buffer[4] << 8) + buffer[5],
          &buffer[6]);
 
-  for (w=first_player; w; w=w->next)
+  for (w = first_player; w; w = w->next)
     if (w->introduced)
       w->active = 1;
 
@@ -347,7 +366,7 @@ static void Handle_OP_START_PLAYING(struct NetworkServerPlayerInfo *player)
   ServerFrameCounter = 0;
 
   /* reset player actions */
-  for (v=first_player; v; v=v->next)
+  for (v = first_player; v; v = v->next)
   {
     v->action = 0;
     v->action_received = FALSE;
@@ -380,14 +399,14 @@ static void Handle_OP_STOP_PLAYING(struct NetworkServerPlayerInfo *player)
   broadcast(NULL, 2, 0);
 }
 
-static void Handle_OP_MOVE_FIGURE(struct NetworkServerPlayerInfo *player)
+static void Handle_OP_MOVE_PLAYER(struct NetworkServerPlayerInfo *player)
 {
   struct NetworkServerPlayerInfo *v;
   int last_client_nr = 0;
   int i;
 
   /* store player action */
-  for (v=first_player; v; v=v->next)
+  for (v = first_player; v; v = v->next)
   {
     if (v->number == player->number)
     {
@@ -397,7 +416,7 @@ static void Handle_OP_MOVE_FIGURE(struct NetworkServerPlayerInfo *player)
   }
 
   /* check if server received action from each player */
-  for (v=first_player; v; v=v->next)
+  for (v = first_player; v; v = v->next)
   {
     if (!v->action_received)
       return;
@@ -407,11 +426,11 @@ static void Handle_OP_MOVE_FIGURE(struct NetworkServerPlayerInfo *player)
   }
 
   /* initialize all player actions to zero */
-  for (i=0; i<last_client_nr; i++)
+  for (i = 0; i < last_client_nr; i++)
     buffer[6 + i] = 0;
 
   /* broadcast actions of all players to all players */
-  for (v=first_player; v; v=v->next)
+  for (v = first_player; v; v = v->next)
   {
     buffer[6 + v->number-1] = v->action;
     v->action = 0;
@@ -480,8 +499,8 @@ void NetworkServer(int port, int serveronly)
   if (is_daemon)
   {
     /* become a daemon, breaking all ties with the controlling terminal */
-    options.verbose = 0;
-    for (i=0; i<255; i++)
+    options.verbose = FALSE;
+    for (i = 0; i < 255; i++)
     {
       if (i != lfd)
        close(i);
@@ -507,11 +526,11 @@ void NetworkServer(int port, int serveronly)
          PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, PROTOCOL_VERSION_3);
   }
 
-  while(1)
+  while (1)
   {
     interrupt = 0;
 
-    for (player=first_player; player; player=player->next)
+    for (player = first_player; player; player = player->next)
       flushuser(player);
 
     FD_ZERO(&fds);
@@ -638,8 +657,8 @@ void NetworkServer(int port, int serveronly)
              Handle_OP_STOP_PLAYING(player);
              break;
 
-           case OP_MOVE_FIGURE:
-             Handle_OP_MOVE_FIGURE(player);
+           case OP_MOVE_PLAYER:
+             Handle_OP_MOVE_PLAYER(player);
              break;
 
            case OP_BROADCAST_MESSAGE: