X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fnetwork.c;h=010e8b33f6c6bef3931c50b2cf5884ca0b52575c;hb=d5a1ec86f68d4b1bf514d60f2245c1894f7295a9;hp=66a57e4591a870641f196999b8a393e660e25cb5;hpb=5771da1ed1f20e77bfeac44eee6da8cf9894e7a3;p=rocksndiamonds.git diff --git a/src/network.c b/src/network.c index 66a57e45..010e8b33 100644 --- a/src/network.c +++ b/src/network.c @@ -52,24 +52,45 @@ static boolean stop_network_game = FALSE; static void DrawNetworkTextExt(char *message, int font_nr, boolean initialize) { static int xpos = 0, ypos = 0; + static int max_line_width = 0; int font_width = getFontWidth(font_nr); int font_height = getFontHeight(font_nr); + int ypos_1 = 120; + int ypos_2 = 150; if (initialize) { - xpos = (WIN_XSIZE - getTextWidth(message, font_nr)) / 2; - ypos = 120; + if (game_status == GAME_MODE_LOADING) + { + max_line_width = WIN_XSIZE; + + xpos = (max_line_width - getTextWidth(message, font_nr)) / 2; + ypos = ypos_1; + + DrawText(xpos, ypos, message, font_nr); + + xpos = 0; + ypos = ypos_2; + } + else + { + max_line_width = SXSIZE; - DrawText(xpos, ypos, message, font_nr); + DrawTextSCentered(ypos_1, font_nr, message); - xpos = 0; - ypos = 150; + /* calculate offset to x position caused by rounding */ + int max_chars_per_line = max_line_width / font_width; + int xoffset = (max_line_width - max_chars_per_line * font_width) / 2; + + xpos = SX + xoffset; + ypos = SY + ypos_2; + } Error(ERR_DEBUG, "========== %s ==========", message); } else { - int max_chars_per_line = WIN_XSIZE / font_width; + int max_chars_per_line = max_line_width / font_width; int max_lines_per_text = 10; int num_lines_spacing = (font_nr == FC_YELLOW ? 1 : 3); int num_lines_printed = DrawTextBuffer(xpos, ypos, message, font_nr, @@ -219,25 +240,34 @@ boolean ConnectToServer(char *hostname, int port) DrawNetworkText("Looking for local network server ..."); - if (SDLNet_CheckSockets(udp_socket_set, 1000) == 1) + /* wait for any local network server to answer UDP broadcast */ + for (i = 0; i < 5; i++) { - int num_packets = SDLNet_UDP_Recv(udp, &packet); - - if (num_packets == 1) + if (SDLNet_CheckSockets(udp_socket_set, 0) == 1) { - DrawNetworkText_Success("Network server found!"); + int num_packets = SDLNet_UDP_Recv(udp, &packet); + + if (num_packets == 1) + { + DrawNetworkText_Success("Network server found!"); - server_host = SDLNet_Read32(&packet.address.host); + server_host = SDLNet_Read32(&packet.address.host); + } + else + { + DrawNetworkText_Failed("No answer from network server!"); + } + + break; } else { - DrawNetworkText_Failed("No answer from network server!"); + Delay_WithScreenUpdates(100); } } - else - { + + if (server_host == 0) DrawNetworkText_Failed("No network server found!"); - } } rfds = SDLNet_AllocSocketSet(1); @@ -307,7 +337,7 @@ boolean ConnectToServer(char *hostname, int port) return TRUE; } - Delay(100); + Delay_WithScreenUpdates(100); } DrawNetworkText_Failed("Failed to connect to network server!"); @@ -547,6 +577,20 @@ static void Handle_OP_PLAYER_DISCONNECTED() stored_player[index_nr].connected_locally = FALSE; stored_player[index_nr].connected_network = FALSE; + + if (game_status == GAME_MODE_PLAYING) + { + char message[100]; + + sprintf(message, "Player %d left network server! Network game stopped!", + player_nr); + + Request(message, REQ_CONFIRM | REQ_STAY_CLOSED); + + SetGameStatus(GAME_MODE_MAIN); + + DrawMainMenu(); + } } static void Handle_OP_START_PLAYING() @@ -615,11 +659,13 @@ static void Handle_OP_STOP_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 = (buffer[2] == NETWORK_STOP_BY_PLAYER ? - "Network game stopped by player!" : - buffer[2] == NETWORK_STOP_BY_ERROR ? - "Network game stopped due to internal error!" : - "Network game stopped!"); + char message[100]; + + sprintf(message, (buffer[2] == NETWORK_STOP_BY_PLAYER ? + "Network game stopped by player %d!" : + buffer[2] == NETWORK_STOP_BY_ERROR ? + "Network game stopped due to internal error!" : + "Network game stopped!"), client_nr); if (buffer[2] != NETWORK_STOP_BY_PLAYER || stopped_by_remote_player) Request(message, REQ_CONFIRM | REQ_STAY_CLOSED); @@ -820,5 +866,5 @@ void DisconnectFromNetworkServer() DrawNetworkText_Success("Successfully disconnected!"); /* short time to recognize result of network initialization */ - Delay(1000); + Delay_WithScreenUpdates(1000); }