- case OP_NICK:
- printf("OP_NICK: %d\n", buf[0]);
- u = finduser(buf[0]);
- buf[len] = 0;
- sprintf(msgbuf, "client %d calls itself \"%s\"", buf[0], &buf[2]);
- sysmsg(msgbuf);
- strncpy(u->name, &buf[2], MAXNICKLEN);
- break;
-
- case OP_GONE:
- printf("OP_GONE: %d\n", buf[0]);
- u = finduser(buf[0]);
- sprintf(msgbuf, "client %d (%s) disconnected",
- buf[0], get_user_name(buf[0]));
- sysmsg(msgbuf);
-
- for (v = &me; v; v = v->next)
- if (v->next == u)
- v->next = u->next;
- free(u);
+ printf("OP_PLAYER_CONNECTED: %d\n", new_client_nr);
+ Error(ERR_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");
+
+ last_player = player;
+ }
+
+ last_player->next = player =
+ checked_malloc(sizeof(struct NetworkClientPlayerInfo));
+ player->nr = new_client_nr;
+ player->name[0] = '\0';
+ player->next = NULL;
+
+ stored_player[new_index_nr].connected = TRUE;
+}
+
+static void Handle_OP_PLAYER_DISCONNECTED()
+{
+ struct NetworkClientPlayerInfo *player, *player_disconnected;
+ int player_nr = (int)buffer[0];
+
+ printf("OP_PLAYER_DISCONNECTED: %d\n", player_nr);
+ player_disconnected = getNetworkPlayer(player_nr);
+ Error(ERR_NETWORK_CLIENT, "client %d (%s) disconnected",
+ player_nr, getNetworkPlayerName(buffer[0]));
+
+ for (player=&first_player; player; player=player->next)
+ if (player->next == player_disconnected)
+ player->next = player_disconnected->next;
+ free(player_disconnected);
+}
+
+static void Handle_OP_START_PLAYING()
+{
+ LevelDirTree *new_leveldir;
+ int new_level_nr;
+ int dummy; /* !!! HAS NO MEANING ANYMORE !!! */
+ unsigned long new_random_seed;
+ char *new_leveldir_identifier;
+
+ new_level_nr = (buffer[2] << 8) + buffer[3];
+ dummy = (buffer[4] << 8) + buffer[5];
+ new_random_seed =
+ (buffer[6] << 24) | (buffer[7] << 16) | (buffer[8] << 8) | (buffer[9]);
+ new_leveldir_identifier = (char *)&buffer[10];
+
+ new_leveldir = getTreeInfoFromIdentifier(leveldir_first,
+ new_leveldir_identifier);
+ if (new_leveldir == NULL)
+ {
+ Error(ERR_WARN, "no such level identifier: '%s'", new_leveldir_identifier);
+
+ new_leveldir = leveldir_first;
+ Error(ERR_WARN, "using default level set: '%s'", new_leveldir->identifier);
+ }
+
+ printf("OP_START_PLAYING: %d\n", buffer[0]);
+ Error(ERR_NETWORK_CLIENT,
+ "client %d starts game [level %d from level identifier '%s']\n",
+ buffer[0], new_level_nr, new_leveldir->identifier);
+
+ leveldir_current = new_leveldir;
+ level_nr = new_level_nr;
+
+ TapeErase();
+ LoadTape(level_nr);
+ LoadLevel(level_nr);
+
+ if (setup.autorecord)
+ TapeStartRecording();
+
+ if (tape.recording)
+ tape.random_seed = new_random_seed;
+
+ InitRND(new_random_seed);
+
+ game_status = GAME_MODE_PLAYING;
+ InitGame();
+}
+
+static void Handle_OP_PAUSE_PLAYING()
+{
+ printf("OP_PAUSE_PLAYING: %d\n", buffer[0]);
+ Error(ERR_NETWORK_CLIENT, "client %d pauses game", buffer[0]);
+
+ tape.pausing = TRUE;
+ DrawVideoDisplay(VIDEO_STATE_PAUSE_ON,0);
+}