diff options
Diffstat (limited to 'src/net_gui.c')
-rw-r--r-- | src/net_gui.c | 166 |
1 files changed, 125 insertions, 41 deletions
diff --git a/src/net_gui.c b/src/net_gui.c index 0ff9e55b..39bd39fd 100644 --- a/src/net_gui.c +++ b/src/net_gui.c @@ -24,11 +24,12 @@ // start the game. // +#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include "config.h" -#include "doomstat.h" +#include "doomkeys.h" #include "i_system.h" #include "i_timer.h" @@ -36,14 +37,17 @@ #include "net_client.h" #include "net_gui.h" +#include "net_query.h" #include "net_server.h" #include "textscreen.h" static txt_window_t *window; -static txt_label_t *player_labels[MAXPLAYERS]; -static txt_label_t *ip_labels[MAXPLAYERS]; +static int old_max_players; +static txt_label_t *player_labels[NET_MAXPLAYERS]; +static txt_label_t *ip_labels[NET_MAXPLAYERS]; static txt_label_t *drone_label; +static txt_label_t *master_msg_label; static boolean had_warning; static void EscapePressed(TXT_UNCAST_ARG(widget), void *unused) @@ -52,23 +56,38 @@ static void EscapePressed(TXT_UNCAST_ARG(widget), void *unused) I_Quit(); } -static void StartGame(TXT_UNCAST_ARG(widget), void *unused) +static void StartGame(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(unused)) { - NET_CL_StartGame(); + NET_CL_LaunchGame(); } -static void BuildGUI(void) +static void OpenWaitDialog(void) { - char buf[50]; - txt_table_t *table; txt_window_action_t *cancel; - int i; - - had_warning = false; TXT_SetDesktopTitle(PACKAGE_STRING); - + window = TXT_NewWindow("Waiting for game start..."); + + TXT_AddWidget(window, TXT_NewLabel("\nPlease wait...\n\n")); + + cancel = TXT_NewWindowAction(KEY_ESCAPE, "Cancel"); + TXT_SignalConnect(cancel, "pressed", EscapePressed, NULL); + + TXT_SetWindowAction(window, TXT_HORIZ_LEFT, cancel); + TXT_SetWindowPosition(window, TXT_HORIZ_CENTER, TXT_VERT_BOTTOM, + TXT_SCREEN_W / 2, TXT_SCREEN_H - 9); + + old_max_players = 0; +} + +static void BuildWindow(void) +{ + char buf[50]; + txt_table_t *table; + int i; + + TXT_ClearTable(window); table = TXT_NewTable(3); TXT_AddWidget(window, table); @@ -79,8 +98,8 @@ static void BuildGUI(void) TXT_AddWidget(table, TXT_NewStrut(17, 1)); // Player labels - - for (i=0; i<MAXPLAYERS; ++i) + + for (i = 0; i < net_client_wait_data.max_players; ++i) { sprintf(buf, " %i. ", i + 1); TXT_AddWidget(table, TXT_NewLabel(buf)); @@ -93,11 +112,6 @@ static void BuildGUI(void) drone_label = TXT_NewLabel(""); TXT_AddWidget(window, drone_label); - - cancel = TXT_NewWindowAction(KEY_ESCAPE, "Cancel"); - TXT_SignalConnect(cancel, "pressed", EscapePressed, NULL); - - TXT_SetWindowAction(window, TXT_HORIZ_LEFT, cancel); } static void UpdateGUI(void) @@ -106,11 +120,27 @@ static void UpdateGUI(void) char buf[50]; unsigned int i; - for (i=0; i<MAXPLAYERS; ++i) + // If the value of max_players changes, we must rebuild the + // contents of the window. This includes when the first + // waiting data packet is received. + + if (net_client_received_wait_data) + { + if (net_client_wait_data.max_players != old_max_players) + { + BuildWindow(); + } + } + else + { + return; + } + + for (i = 0; i < net_client_wait_data.max_players; ++i) { txt_color_t color = TXT_COLOR_BRIGHT_WHITE; - if ((signed) i == net_player_number) + if ((signed) i == net_client_wait_data.consoleplayer) { color = TXT_COLOR_YELLOW; } @@ -118,10 +148,12 @@ static void UpdateGUI(void) TXT_SetFGColor(player_labels[i], color); TXT_SetFGColor(ip_labels[i], color); - if (i < net_clients_in_game) + if (i < net_client_wait_data.num_players) { - TXT_SetLabel(player_labels[i], net_player_names[i]); - TXT_SetLabel(ip_labels[i], net_player_addresses[i]); + TXT_SetLabel(player_labels[i], + net_client_wait_data.player_names[i]); + TXT_SetLabel(ip_labels[i], + net_client_wait_data.player_addrs[i]); } else { @@ -130,9 +162,10 @@ static void UpdateGUI(void) } } - if (net_drones_in_game > 0) + if (net_client_wait_data.num_drones > 0) { - sprintf(buf, " (+%i observer clients)", net_drones_in_game); + sprintf(buf, " (+%i observer clients)", + net_client_wait_data.num_drones); TXT_SetLabel(drone_label, buf); } else @@ -140,7 +173,7 @@ static void UpdateGUI(void) TXT_SetLabel(drone_label, ""); } - if (net_client_controller) + if (net_client_wait_data.is_controller) { startgame = TXT_NewWindowAction(' ', "Start game"); TXT_SignalConnect(startgame, "pressed", StartGame, NULL); @@ -153,6 +186,55 @@ static void UpdateGUI(void) TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, startgame); } +static void BuildMasterStatusWindow(void) +{ + txt_window_t *master_window; + + master_window = TXT_NewWindow(NULL); + master_msg_label = TXT_NewLabel(""); + TXT_AddWidget(master_window, master_msg_label); + + // This window is here purely for information, so it should be + // in the background. + + TXT_LowerWindow(master_window); + TXT_SetWindowPosition(master_window, TXT_HORIZ_CENTER, TXT_VERT_CENTER, + TXT_SCREEN_W / 2, TXT_SCREEN_H - 4); + TXT_SetWindowAction(master_window, TXT_HORIZ_LEFT, NULL); + TXT_SetWindowAction(master_window, TXT_HORIZ_CENTER, NULL); + TXT_SetWindowAction(master_window, TXT_HORIZ_RIGHT, NULL); +} + +static void CheckMasterStatus(void) +{ + boolean added; + + if (!NET_Query_CheckAddedToMaster(&added)) + { + return; + } + + if (master_msg_label == NULL) + { + BuildMasterStatusWindow(); + } + + if (added) + { + TXT_SetLabel(master_msg_label, + "Your server is now registered with the global master server.\n" + "Other players can find your server online."); + } + else + { + TXT_SetLabel(master_msg_label, + "Failed to register with the master server. Your server is not\n" + "publicly accessible. You may need to reconfigure your Internet\n" + "router to add a port forward for UDP port 2342. Look up\n" + "information on port forwarding online."); + } +} + static void PrintSHA1Digest(char *s, byte *digest) { unsigned int i; @@ -178,11 +260,13 @@ static void CheckSHA1Sums(void) return; } - correct_wad = memcmp(net_local_wad_sha1sum, net_server_wad_sha1sum, + correct_wad = memcmp(net_local_wad_sha1sum, + net_client_wait_data.wad_sha1sum, sizeof(sha1_digest_t)) == 0; - correct_deh = memcmp(net_local_deh_sha1sum, net_server_deh_sha1sum, + correct_deh = memcmp(net_local_deh_sha1sum, + net_client_wait_data.deh_sha1sum, sizeof(sha1_digest_t)) == 0; - same_freedoom = net_server_is_freedoom == net_local_is_freedoom; + same_freedoom = net_client_wait_data.is_freedoom == net_local_is_freedoom; if (correct_wad && correct_deh && same_freedoom) { @@ -193,7 +277,7 @@ static void CheckSHA1Sums(void) { printf("Warning: WAD SHA1 does not match server:\n"); PrintSHA1Digest("Local", net_local_wad_sha1sum); - PrintSHA1Digest("Server", net_server_wad_sha1sum); + PrintSHA1Digest("Server", net_client_wait_data.wad_sha1sum); } if (!same_freedoom) @@ -201,14 +285,14 @@ static void CheckSHA1Sums(void) printf("Warning: Mixing Freedoom with non-Freedoom\n"); printf("Local: %i Server: %i\n", net_local_is_freedoom, - net_server_is_freedoom); + net_client_wait_data.is_freedoom); } if (!correct_deh) { printf("Warning: Dehacked SHA1 does not match server:\n"); PrintSHA1Digest("Local", net_local_deh_sha1sum); - PrintSHA1Digest("Server", net_server_deh_sha1sum); + PrintSHA1Digest("Server", net_client_wait_data.deh_sha1sum); } window = TXT_NewWindow("WARNING"); @@ -254,11 +338,11 @@ static void CheckSHA1Sums(void) TXT_AddWidget(window, TXT_NewLabel ("If you continue, this may cause your game to desync.")); - + had_warning = true; } -void NET_WaitForStart(void) +void NET_WaitForLaunch(void) { if (!TXT_Init()) { @@ -266,15 +350,16 @@ void NET_WaitForStart(void) exit(-1); } - I_SetWindowCaption(); - I_SetWindowIcon(); + I_InitWindowIcon(); - BuildGUI(); + OpenWaitDialog(); + had_warning = false; - while (net_waiting_for_start) + while (net_waiting_for_launch) { UpdateGUI(); CheckSHA1Sums(); + CheckMasterStatus(); TXT_DispatchEvents(); TXT_DrawDesktop(); @@ -289,7 +374,6 @@ void NET_WaitForStart(void) TXT_Sleep(100); } - + TXT_Shutdown(); } - |