+ }
+
+ /* copy valid player actions (will be set to 0 for not connected players) */
+ for (i = 0; i < MAX_PLAYERS; i++)
+ stored_player[i].effective_action =
+ getNetworkBuffer8BitInteger(read_buffer);
+
+ network_player_action_received = TRUE;
+}
+
+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);
+}
+
+static void Handle_OP_LEVEL_FILE(void)
+{
+ int player_nr = getNetworkBuffer8BitInteger(read_buffer);
+ char *leveldir_identifier;
+ char *network_level_dir;
+ struct LevelFileInfo *file_info = &network_level.file_info;
+ struct LevelFileInfo *tmpl_info = &network_level.tmpl_info;
+ boolean use_custom_template;
+
+ setString(&network_level.leveldir_identifier, NULL);
+ setString(&network_level.file_info.basename, NULL);
+ setString(&network_level.file_info.filename, NULL);
+ setString(&network_level.tmpl_info.basename, NULL);
+ setString(&network_level.tmpl_info.filename, NULL);
+
+ printf("OP_LEVEL_FILE: %d\n", player_nr);
+
+ leveldir_identifier = getStringCopy(getNetworkBufferString(read_buffer));
+
+ if (hasPathSeparator(leveldir_identifier))
+ Error(ERR_EXIT, "protocol error: invalid filename from network client");
+
+ InitNetworkLevelDirectory(leveldir_identifier);
+
+ network_level_dir = getNetworkLevelDir(leveldir_identifier);
+
+ file_info->nr = getNetworkBuffer16BitInteger(read_buffer);
+ file_info->type = getNetworkBuffer8BitInteger(read_buffer);
+ file_info->packed = getNetworkBuffer8BitInteger(read_buffer);
+ file_info->basename = getStringCopy(getNetworkBufferString(read_buffer));
+ 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");
+
+ getNetworkBufferFile(read_buffer, file_info->filename);
+
+ use_custom_template = getNetworkBuffer8BitInteger(read_buffer);
+ if (use_custom_template)
+ {
+ *tmpl_info = *file_info;
+
+ tmpl_info->basename = getStringCopy(getNetworkBufferString(read_buffer));
+ 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");
+
+ getNetworkBufferFile(read_buffer, tmpl_info->filename);
+ }
+
+ network_level.leveldir_identifier = leveldir_identifier;
+ network_level.use_custom_template = use_custom_template;
+
+ /* the receiving client(s) use(s) the transferred network level files */
+ 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);
+
+ if (use_custom_template)
+ printf("::: '%s'\n", tmpl_info->filename);
+#endif
+}
+
+static void HandleNetworkingMessage(void)
+{
+ stop_network_game = FALSE;
+
+ initNetworkBufferForReading(read_buffer);
+
+ int message_type = getNetworkBuffer8BitInteger(read_buffer);
+
+ switch (message_type)
+ {
+ case OP_BAD_PROTOCOL_VERSION:
+ Handle_OP_BAD_PROTOCOL_VERSION();
+ break;
+
+ case OP_YOUR_NUMBER:
+ Handle_OP_YOUR_NUMBER();
+ break;
+
+ case OP_NUMBER_WANTED:
+ Handle_OP_NUMBER_WANTED();
+ break;
+
+ case OP_PLAYER_NAME:
+ Handle_OP_PLAYER_NAME();
+ break;