summaryrefslogtreecommitdiff
path: root/src/net_gui.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/net_gui.c')
-rw-r--r--src/net_gui.c166
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();
}
-