fixed ignoring clicks on global animations after executing event actions
[rocksndiamonds.git] / src / network.c
index e62df4ce2d5e596a963f1a03959a63db5c5156e9..b51402eb7299e7cb299018f9deebb74d2187b8c7 100644 (file)
@@ -98,7 +98,7 @@ char *getNetworkPlayerName(int player_nr)
     return("you");
   else
     for (player = &first_player; player; player = player->next)
-      if (player->nr == player_nr && player->name && strlen(player->name))
+      if (player->nr == player_nr && strlen(player->name) > 0)
        return(player->name);
 
   return(EMPTY_PLAYER_NAME);
@@ -275,11 +275,15 @@ static void Handle_OP_YOUR_NUMBER()
 
   if (old_local_player != new_local_player)
   {
-    /* copy existing player settings and change to new player */
+    /* set relevant player settings and change to new player */
 
-    *new_local_player = *old_local_player;
-    old_local_player->connected = FALSE;
     local_player = new_local_player;
+
+    old_local_player->connected_locally = FALSE;
+    new_local_player->connected_locally = TRUE;
+
+    old_local_player->connected_network = FALSE;
+    new_local_player->connected_network = TRUE;
   }
 
   if (first_player.nr > MAX_PLAYERS)
@@ -313,17 +317,22 @@ static void Handle_OP_NUMBER_WANTED()
 
     if (old_client_nr != new_client_nr)
     {
-      /* copy existing player settings and change to new player */
+      /* set relevant player settings and change to new player */
 
-      *new_player = *old_player;
-      old_player->connected = FALSE;
+      old_player->connected_network = FALSE;
+      new_player->connected_network = TRUE;
     }
 
     player = getNetworkPlayer(old_client_nr);
     player->nr = new_client_nr;
 
     if (old_player == local_player)            /* local player switched */
+    {
       local_player = new_player;
+
+      old_player->connected_locally = FALSE;
+      new_player->connected_locally = TRUE;
+    }
   }
   else if (old_client_nr == first_player.nr)   /* failed -- local player? */
   {
@@ -375,13 +384,14 @@ static void Handle_OP_PLAYER_CONNECTED()
   player->name[0] = '\0';
   player->next = NULL;
 
-  stored_player[new_index_nr].connected = TRUE;
+  stored_player[new_index_nr].connected_network = TRUE;
 }
 
 static void Handle_OP_PLAYER_DISCONNECTED()
 {
   struct NetworkClientPlayerInfo *player, *player_disconnected;
   int player_nr = (int)buffer[0];
+  int index_nr = player_nr - 1;
 
   printf("OP_PLAYER_DISCONNECTED: %d\n", player_nr);
   player_disconnected = getNetworkPlayer(player_nr);
@@ -392,6 +402,9 @@ static void Handle_OP_PLAYER_DISCONNECTED()
     if (player->next == player_disconnected)
       player->next = player_disconnected->next;
   free(player_disconnected);
+
+  stored_player[index_nr].connected_locally = FALSE;
+  stored_player[index_nr].connected_network = FALSE;
 }
 
 static void Handle_OP_START_PLAYING()
@@ -464,7 +477,8 @@ static void Handle_OP_STOP_PLAYING()
       Request("Network game stopped!", REQ_CONFIRM);
   }
 
-  game_status = GAME_MODE_MAIN;
+  SetGameStatus(GAME_MODE_MAIN);
+
   DrawMainMenu();
 }
 
@@ -494,7 +508,7 @@ static void Handle_OP_MOVE_PLAYER(unsigned int len)
   /* copy valid player actions */
   for (i = 0; i < MAX_PLAYERS; i++)
     stored_player[i].effective_action =
-      (i < len - 6 && stored_player[i].active ? buffer[6 + i] : 0);
+      (i < len - 6 ? buffer[6 + i] : 0);
 
   network_player_action_received = TRUE;
 }