added creating engine snapshots when using mouse click events
[rocksndiamonds.git] / src / network.c
index 2730c7b01967842e533a1e2a5b26df25323e93b1..2905dc5737c6f0d94e33f22740162acbf38e4fff 100644 (file)
@@ -4,7 +4,7 @@
 // (c) 1995-2014 by Artsoft Entertainment
 //                         Holger Schemel
 //                 info@artsoft.org
-//                 http://www.artsoft.org/
+//                 https://www.artsoft.org/
 // ----------------------------------------------------------------------------
 // network.c
 // ============================================================================
@@ -90,7 +90,7 @@ static void DrawNetworkTextExt(char *message, int font_nr, boolean initialize)
       ypos = SY + ypos_2;
     }
 
-    Error(ERR_DEBUG, "========== %s ==========", message);
+    Debug("network:client", "========== %s ==========", message);
   }
   else
   {
@@ -104,7 +104,7 @@ static void DrawNetworkTextExt(char *message, int font_nr, boolean initialize)
 
     ypos += (num_lines_printed + num_lines_spacing) * font_height;
 
-    Error(ERR_DEBUG, "%s", message);
+    Debug("network:client", "%s", message);
   }
 
   BackToFront();
@@ -151,8 +151,7 @@ static struct NetworkClientPlayerInfo *getNetworkPlayer(int player_nr)
       break;
 
   if (player == NULL)  // should not happen
-    Error(ERR_EXIT, "protocol error: reference to non-existing player %d",
-         player_nr);
+    Fail("protocol error: reference to non-existing player %d", player_nr);
 
   return player;
 }
@@ -188,13 +187,9 @@ static void StartNetworkServer(int port)
   static int p;
 
   p = port;
-#if defined(TARGET_SDL2)
-  server_thread = SDL_CreateThread(NetworkServerThread,
-                                  "NetworkServerThread", &p);
-#else
-  server_thread = SDL_CreateThread(NetworkServerThread, &p);
-#endif
-  network_server = TRUE;
+
+  network.server_thread = SDL_CreateThread(NetworkServerThread,
+                                          "NetworkServerThread", &p);
 }
 
 boolean ConnectToServer(char *hostname, int port)
@@ -221,15 +216,14 @@ boolean ConnectToServer(char *hostname, int port)
 
     SDLNet_SocketSet udp_socket_set = SDLNet_AllocSocketSet(1);
     if (!udp_socket_set)
-      Error(ERR_EXIT, "SDLNet_AllocSocketSet() failed: %s"), SDLNet_GetError();
+      Fail("SDLNet_AllocSocketSet() failed: %s"), SDLNet_GetError();
 
     udp = SDLNet_UDP_Open(0);
-    if(!udp)
-      Error(ERR_EXIT, "SDLNet_UDP_Open() failed: %s", SDLNet_GetError());
+    if (!udp)
+      Fail("SDLNet_UDP_Open() failed: %s", SDLNet_GetError());
 
     if (SDLNet_UDP_AddSocket(udp_socket_set, udp) == -1)
-      Error(ERR_EXIT_NETWORK_SERVER, "SDLNet_TCP_AddSocket() failed: %s"),
-        SDLNet_GetError();
+      Fail("SDLNet_TCP_AddSocket() failed: %s"), SDLNet_GetError();
 
     char *data_ptr = "network server UDB broadcast";
     int data_len = strlen(data_ptr) + 1;
@@ -335,7 +329,7 @@ boolean ConnectToServer(char *hostname, int port)
     SDLNet_Write16(port,        &ip.port);
   }
 
-  Error(ERR_DEBUG, "trying to connect to network server at %d.%d.%d.%d ...",
+  Debug("network:client", "trying to connect to network server at %d.%d.%d.%d ...",
         (server_host >> 24) & 0xff,
         (server_host >> 16) & 0xff,
         (server_host >>  8) & 0xff,
@@ -358,7 +352,7 @@ boolean ConnectToServer(char *hostname, int port)
     else
       DrawNetworkText_Failed("No local network server found!");
 
-    printf("SDLNet_TCP_Open(): %s\n", SDLNet_GetError());
+    Debug("network:client", "SDLNet_TCP_Open(): %s", SDLNet_GetError());
   }
 
   if (hostname)                        // connect to specified server failed
@@ -397,7 +391,7 @@ void SendToServer_PlayerName(char *player_name)
 
   SendNetworkBufferToServer(write_buffer);
 
-  Error(ERR_NETWORK_CLIENT, "you set your player name to \"%s\"", player_name);
+  Debug("network:client", "you set your player name to \"%s\"", player_name);
 }
 
 void SendToServer_ProtocolVersion(void)
@@ -446,15 +440,15 @@ void SendToServer_LevelFile(void)
   network_level.use_network_level_files = FALSE;
 
 #if 0
-  printf("::: '%s'\n", leveldir_current->identifier);
-  printf("::: '%d'\n", level.file_info.nr);
-  printf("::: '%d'\n", level.file_info.type);
-  printf("::: '%d'\n", level.file_info.packed);
-  printf("::: '%s'\n", level.file_info.basename);
-  printf("::: '%s'\n", level.file_info.filename);
+  Debug("network:client", "'%s'", leveldir_current->identifier);
+  Debug("network:client", "'%d'", level.file_info.nr);
+  Debug("network:client", "'%d'", level.file_info.type);
+  Debug("network:client", "'%d'", level.file_info.packed);
+  Debug("network:client", "'%s'", level.file_info.basename);
+  Debug("network:client", "'%s'", level.file_info.filename);
 
   if (level.use_custom_template)
-    printf("::: '%s'\n", level_template.file_info.filename);
+    Debug("network:client", "'%s'", level_template.file_info.filename);
 #endif
 }
 
@@ -508,8 +502,8 @@ static void Handle_OP_BAD_PROTOCOL_VERSION(void)
   int protocol_version_major = getNetworkBuffer8BitInteger(read_buffer);
   int protocol_version_minor = getNetworkBuffer8BitInteger(read_buffer);
 
-  Error(ERR_WARN, "protocol version mismatch");
-  Error(ERR_WARN, "server expects %d.%d.x instead of %d.%d.%d",
+  Warn("protocol version mismatch");
+  Warn("server expects %d.%d.x instead of %d.%d.%d",
        protocol_version_major,
        protocol_version_minor,
        PROTOCOL_VERSION_MAJOR,
@@ -534,7 +528,8 @@ static void Handle_OP_YOUR_NUMBER(void)
   struct PlayerInfo *old_local_player = local_player;
   struct PlayerInfo *new_local_player = &stored_player[new_index_nr];
 
-  printf("OP_YOUR_NUMBER: %d\n", old_client_nr);
+  Debug("network:client", "OP_YOUR_NUMBER: %d", old_client_nr);
+
   first_player.nr = new_client_nr;
 
   if (old_local_player != new_local_player)
@@ -551,9 +546,9 @@ static void Handle_OP_YOUR_NUMBER(void)
   }
 
   if (first_player.nr > MAX_PLAYERS)
-    Error(ERR_EXIT, "sorry, more than %d players not allowed", MAX_PLAYERS);
+    Fail("sorry, more than %d players not allowed", MAX_PLAYERS);
 
-  Error(ERR_NETWORK_CLIENT, "you get client # %d", new_client_nr);
+  Debug("network:client", "you get client # %d", new_client_nr);
 
   stored_player[new_index_nr].connected_network = TRUE;
 }
@@ -569,17 +564,17 @@ static void Handle_OP_NUMBER_WANTED(void)
   struct PlayerInfo *old_player = &stored_player[old_index_nr];
   struct PlayerInfo *new_player = &stored_player[new_index_nr];
 
-  printf("OP_NUMBER_WANTED: %d\n", old_client_nr);
+  Debug("network:client", "OP_NUMBER_WANTED: %d", old_client_nr);
 
   if (new_client_nr == client_nr_wanted)       // switching succeeded
   {
     struct NetworkClientPlayerInfo *player;
 
     if (old_client_nr != client_nr_wanted)     // client's nr has changed
-      Error(ERR_NETWORK_CLIENT, "client %d switches to # %d",
+      Debug("network:client", "client %d switches to # %d",
            old_client_nr, new_client_nr);
     else if (old_client_nr == first_player.nr) // local player keeps his nr
-      Error(ERR_NETWORK_CLIENT, "keeping client # %d", new_client_nr);
+      Debug("network:client", "keeping client # %d", new_client_nr);
 
     if (old_client_nr != new_client_nr)
     {
@@ -609,7 +604,7 @@ static void Handle_OP_NUMBER_WANTED(void)
 
     Request(request, REQ_CONFIRM);
 
-    Error(ERR_NETWORK_CLIENT, "cannot switch -- you keep client # %d",
+    Debug("network:client", "cannot switch -- you keep client # %d",
          new_client_nr);
   }
 
@@ -623,12 +618,12 @@ static void Handle_OP_PLAYER_NAME(void)
   char *player_name = getNetworkBufferString(read_buffer);
   struct NetworkClientPlayerInfo *player = getNetworkPlayer(player_nr);
 
-  printf("OP_PLAYER_NAME: %d\n", player_nr);
+  Debug("network:client", "OP_PLAYER_NAME: %d", player_nr);
 
   strncpy(player->name, player_name, MAX_PLAYER_NAME_LEN);
   player->name[MAX_PLAYER_NAME_LEN] = '\0';
 
-  Error(ERR_NETWORK_CLIENT, "client %d calls itself \"%s\"",
+  Debug("network:client", "client %d calls itself \"%s\"",
        player_nr, player->name);
 }
 
@@ -638,13 +633,13 @@ static void Handle_OP_PLAYER_CONNECTED(void)
   int new_client_nr = getNetworkBuffer8BitInteger(read_buffer);
   int new_index_nr = new_client_nr - 1;
 
-  printf("OP_PLAYER_CONNECTED: %d\n", new_client_nr);
-  Error(ERR_NETWORK_CLIENT, "new client %d connected", new_client_nr);
+  Debug("network:client", "OP_PLAYER_CONNECTED: %d", new_client_nr);
+  Debug("network:client", "new client %d connected", new_client_nr);
 
   for (player = &first_player; player; player = player->next)
   {
     if (player->nr == new_client_nr)
-      Error(ERR_EXIT, "multiplayer server sent duplicate player id");
+      Fail("multiplayer server sent duplicate player id");
 
     last_player = player;
   }
@@ -664,11 +659,12 @@ static void Handle_OP_PLAYER_DISCONNECTED(void)
   int player_nr = getNetworkBuffer8BitInteger(read_buffer);
   int index_nr = player_nr - 1;
 
-  printf("OP_PLAYER_DISCONNECTED: %d\n", player_nr);
-  player_disconnected = getNetworkPlayer(player_nr);
-  Error(ERR_NETWORK_CLIENT, "client %d (%s) disconnected",
+  Debug("network:client", "OP_PLAYER_DISCONNECTED: %d", player_nr);
+  Debug("network:client", "client %d (%s) disconnected",
        player_nr, getNetworkPlayerName(player_nr));
 
+  player_disconnected = getNetworkPlayer(player_nr);
+
   for (player = &first_player; player; player = player->next)
     if (player->next == player_disconnected)
       player->next = player_disconnected->next;
@@ -705,16 +701,16 @@ static void Handle_OP_START_PLAYING(void)
 
   if (!strEqual(new_leveldir_identifier, network_level.leveldir_identifier))
   {
-    Error(ERR_WARN, "no such level identifier: '%s'", new_leveldir_identifier);
+    Warn("no such level identifier: '%s'", new_leveldir_identifier);
 
     stop_network_game = TRUE;
 
     return;
   }
 
-  printf("OP_START_PLAYING: %d\n", player_nr);
-  Error(ERR_NETWORK_CLIENT,
-       "client %d starts game [level %d from level identifier '%s']\n",
+  Debug("network:client", "OP_START_PLAYING: %d", player_nr);
+  Debug("network:client",
+       "client %d starts game [level %d from level identifier '%s']",
        player_nr, new_level_nr, new_leveldir_identifier);
 
   LevelDirTree *new_leveldir =
@@ -743,8 +739,8 @@ static void Handle_OP_PAUSE_PLAYING(void)
 {
   int player_nr = getNetworkBuffer8BitInteger(read_buffer);
 
-  printf("OP_PAUSE_PLAYING: %d\n", player_nr);
-  Error(ERR_NETWORK_CLIENT, "client %d pauses game", player_nr);
+  Debug("network:client", "OP_PAUSE_PLAYING: %d", player_nr);
+  Debug("network:client", "client %d pauses game", player_nr);
 
   if (game_status == GAME_MODE_PLAYING)
   {
@@ -757,8 +753,8 @@ static void Handle_OP_CONTINUE_PLAYING(void)
 {
   int player_nr = getNetworkBuffer8BitInteger(read_buffer);
 
-  printf("OP_CONTINUE_PLAYING: %d\n", player_nr);
-  Error(ERR_NETWORK_CLIENT, "client %d continues game", player_nr);
+  Debug("network:client", "OP_CONTINUE_PLAYING: %d", player_nr);
+  Debug("network:client", "client %d continues game", player_nr);
 
   if (game_status == GAME_MODE_PLAYING)
   {
@@ -772,8 +768,9 @@ static void Handle_OP_STOP_PLAYING(void)
   int client_nr = getNetworkBuffer8BitInteger(read_buffer);
   int cause_for_stopping = getNetworkBuffer8BitInteger(read_buffer);
 
-  printf("OP_STOP_PLAYING: %d [%d]\n", client_nr, cause_for_stopping);
-  Error(ERR_NETWORK_CLIENT, "client %d stops game [%d]",
+  Debug("network:client", "OP_STOP_PLAYING: %d [%d]",
+       client_nr, cause_for_stopping);
+  Debug("network:client", "client %d stops game [%d]",
        client_nr, cause_for_stopping);
 
   if (game_status == GAME_MODE_PLAYING)
@@ -811,11 +808,10 @@ static void Handle_OP_MOVE_PLAYER(void)
 
   if (server_frame_counter != FrameCounter)
   {
-    Error(ERR_INFO, "frame counters of client %d and server out of sync",
-         player_nr);
-    Error(ERR_INFO, "frame counter of client is %d", FrameCounter);
-    Error(ERR_INFO, "frame counter of server is %d", server_frame_counter);
-    Error(ERR_INFO, "this should not happen -- please debug");
+    Warn("frame counters of client %d and server out of sync", player_nr);
+    Warn("frame counter of client is %d", FrameCounter);
+    Warn("frame counter of server is %d", server_frame_counter);
+    Warn("this should not happen -- please debug");
 
     stop_network_game = TRUE;
 
@@ -834,8 +830,8 @@ static void Handle_OP_BROADCAST_MESSAGE(void)
 {
   int player_nr = getNetworkBuffer8BitInteger(read_buffer);
 
-  printf("OP_BROADCAST_MESSAGE: %d\n", player_nr);
-  Error(ERR_NETWORK_CLIENT, "client %d sends message", player_nr);
+  Debug("network:client", "OP_BROADCAST_MESSAGE: %d", player_nr);
+  Debug("network:client", "client %d sends message", player_nr);
 }
 
 static void Handle_OP_LEVEL_FILE(void)
@@ -853,12 +849,12 @@ static void Handle_OP_LEVEL_FILE(void)
   setString(&network_level.tmpl_info.basename,  NULL);
   setString(&network_level.tmpl_info.filename,  NULL);
 
-  printf("OP_LEVEL_FILE: %d\n", player_nr);
+  Debug("network:client", "OP_LEVEL_FILE: %d", player_nr);
 
   leveldir_identifier = getStringCopy(getNetworkBufferString(read_buffer));
 
   if (hasPathSeparator(leveldir_identifier))
-    Error(ERR_EXIT, "protocol error: invalid filename from network client");
+    Fail("protocol error: invalid filename from network client");
 
   InitNetworkLevelDirectory(leveldir_identifier);
 
@@ -871,9 +867,13 @@ static void Handle_OP_LEVEL_FILE(void)
   file_info->filename = getPath2(network_level_dir, file_info->basename);
 
   if (hasPathSeparator(file_info->basename))
-    Error(ERR_EXIT, "protocol error: invalid filename from network client");
+    Fail("protocol error: invalid filename from network client");
+
+  int num_bytes = getNetworkBufferFile(read_buffer, file_info->filename);
 
-  getNetworkBufferFile(read_buffer, file_info->filename);
+  // if received level file is empty, remove it (as being non-existent)
+  if (num_bytes == 0)
+    remove(file_info->filename);
 
   use_custom_template = getNetworkBuffer8BitInteger(read_buffer);
   if (use_custom_template)
@@ -884,9 +884,13 @@ static void Handle_OP_LEVEL_FILE(void)
     tmpl_info->filename = getPath2(network_level_dir, tmpl_info->basename);
 
     if (hasPathSeparator(tmpl_info->basename))
-      Error(ERR_EXIT, "protocol error: invalid filename from network client");
+      Fail("protocol error: invalid filename from network client");
 
     getNetworkBufferFile(read_buffer, tmpl_info->filename);
+
+    // if received level file is empty, use level template file instead
+    if (num_bytes == 0)
+      setString(&file_info->filename,  tmpl_info->filename);
   }
 
   network_level.leveldir_identifier = leveldir_identifier;
@@ -896,15 +900,15 @@ static void Handle_OP_LEVEL_FILE(void)
   network_level.use_network_level_files = TRUE;
 
 #if 0
-  printf("::: '%s'\n", leveldir_identifier);
-  printf("::: '%d'\n", file_info->nr);
-  printf("::: '%d'\n", file_info->type);
-  printf("::: '%d'\n", file_info->packed);
-  printf("::: '%s'\n", file_info->basename);
-  printf("::: '%s'\n", file_info->filename);
+  Debug("network:client", "'%s'", leveldir_identifier);
+  Debug("network:client", "'%d'", file_info->nr);
+  Debug("network:client", "'%d'", file_info->type);
+  Debug("network:client", "'%d'", file_info->packed);
+  Debug("network:client", "'%s'", file_info->basename);
+  Debug("network:client", "'%s'", file_info->filename);
 
   if (use_custom_template)
-    printf("::: '%s'\n", tmpl_info->filename);
+    Debug("network:client", "'%s'", tmpl_info->filename);
 #endif
 }
 
@@ -971,9 +975,7 @@ static void HandleNetworkingMessage(void)
       break;
 
     default:
-      if (options.verbose)
-       Error(ERR_NETWORK_CLIENT,
-             "unknown opcode %d from server", message_type);
+      Debug("network:client", "unknown opcode %d from server", message_type);
   }
 
   fflush(stdout);