+static void Handle_OP_START_PLAYING(void)
+{
+ int player_nr = getNetworkBuffer8BitInteger(read_buffer);
+ char *new_leveldir_identifier = getNetworkBufferString(read_buffer);
+ int new_level_nr = getNetworkBuffer16BitInteger(read_buffer);
+ unsigned int new_random_seed = getNetworkBuffer32BitInteger(read_buffer);
+
+ if (!strEqual(new_leveldir_identifier, network_level.leveldir_identifier))
+ {
+ Error(ERR_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",
+ player_nr, new_level_nr, new_leveldir_identifier);
+
+ LevelDirTree *new_leveldir =
+ getTreeInfoFromIdentifier(leveldir_first, new_leveldir_identifier);
+
+ if (new_leveldir != NULL)
+ {
+ leveldir_current = new_leveldir;
+ level_nr = new_level_nr;
+ }
+
+ /* needed if level set of network game changed graphics, sounds or music */
+ ReloadCustomArtwork(0);
+
+ TapeErase();
+
+ if (network_level.use_network_level_files)
+ LoadNetworkLevel(&network_level);
+ else
+ LoadLevel(level_nr);
+
+ StartGameActions(FALSE, setup.autorecord, new_random_seed);
+}
+
+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);
+
+ if (game_status == GAME_MODE_PLAYING)
+ {
+ tape.pausing = TRUE;
+ DrawVideoDisplay(VIDEO_STATE_PAUSE_ON, 0);
+ }
+}
+
+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);
+
+ if (game_status == GAME_MODE_PLAYING)
+ {
+ tape.pausing = FALSE;
+ DrawVideoDisplay(VIDEO_STATE_PAUSE_OFF, 0);
+ }
+}
+
+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]",
+ client_nr, cause_for_stopping);
+
+ if (game_status == GAME_MODE_PLAYING)
+ {
+ int index_nr = client_nr - 1;
+ struct PlayerInfo *client_player = &stored_player[index_nr];
+ boolean stopped_by_remote_player = (!client_player->connected_locally);
+ char message[100];
+
+ if (cause_for_stopping == NETWORK_STOP_BY_PLAYER)
+ sprintf(message, "Network game stopped by player %d!", client_nr);
+ else
+ sprintf(message, (cause_for_stopping == NETWORK_STOP_BY_ERROR ?
+ "Network game stopped due to internal error!" :
+ "Network game stopped!"));
+
+ if (cause_for_stopping != NETWORK_STOP_BY_PLAYER ||
+ stopped_by_remote_player)
+ Request(message, REQ_CONFIRM | REQ_STAY_CLOSED);
+
+ SetGameStatus(GAME_MODE_MAIN);
+
+ DrawMainMenu();
+ }