ref: fba617a6b4504c9a21f2a7f0749570f741fa8254
parent: dd2339bca5ee57aaee232061a4015cf30454e42e
author: Simon Howard <[email protected]>
date: Mon Jan 2 16:50:26 EST 2006
Restructure the waiting screen code. Establish our own separate event loop while waiting for the game to start, to avoid affecting the original code too much. Move some _gui variables to net_client.c. Subversion-branch: /trunk/chocolate-doom Subversion-revision: 252
--- a/src/net_client.c
+++ b/src/net_client.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: net_client.c 246 2006-01-02 20:14:07Z fraggle $
+// $Id: net_client.c 252 2006-01-02 21:50:26Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,11 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.8 2006/01/02 21:50:26 fraggle
+// Restructure the waiting screen code. Establish our own separate event
+// loop while waiting for the game to start, to avoid affecting the original
+// code too much. Move some _gui variables to net_client.c.
+//
// Revision 1.7 2006/01/02 20:14:07 fraggle
// Fix connect timeout and shutdown client properly if we fail to connect.
//
@@ -83,13 +88,38 @@
CLIENT_STATE_DISCONNECTED,
} net_clientstate_t;
-static boolean client_initialised = false;
-
static net_clientstate_t client_state;
static net_addr_t *server_addr;
static net_context_t *client_context;
static int last_send_time;
+// if TRUE, we are connected to a server
+
+boolean net_client_connected = false;
+
+// if TRUE, this client is the controller of the game
+
+boolean net_client_controller = false;
+
+// Number of clients currently connected to the server
+
+int net_clients_in_game;
+
+// Waiting for the game to start?
+
+boolean net_waiting_for_start = false;
+
+// Shut down the client code, etc. Invoked after a disconnect.
+
+static void NET_CL_Shutdown(void)
+{
+ net_client_connected = false;
+
+ NET_FreeAddress(server_addr);
+
+ // Shut down network module, etc. To do.
+}
+
// data received while we are waiting for the game to start
static void NET_CL_ParseWaitingData(net_packet_t *packet)
@@ -154,6 +184,8 @@
fprintf(stderr, "Disconnected from server.\n");
// Now what?
+
+ NET_CL_Disconnect();
}
// parse a DISCONNECT_ACK packet
@@ -283,7 +315,7 @@
net_addr_t *addr;
net_packet_t *packet;
- if (!client_initialised)
+ if (!net_client_connected)
{
return;
}
@@ -315,15 +347,6 @@
}
}
-static void NET_CL_Shutdown(void)
-{
- client_initialised = false;
-
- NET_FreeAddress(server_addr);
-
- // Shut down network module, etc. To do.
-}
-
// connect to a server
boolean NET_CL_Connect(net_addr_t *addr)
@@ -346,7 +369,8 @@
NET_AddModule(client_context, addr->module);
- client_initialised = true;
+ net_client_connected = true;
+ net_waiting_for_start = true;
// try to connect
@@ -400,7 +424,7 @@
{
int start_time;
- if (!client_initialised)
+ if (!net_client_connected)
{
return;
}
--- a/src/net_client.h
+++ b/src/net_client.h
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: net_client.h 239 2006-01-02 00:00:08Z fraggle $
+// $Id: net_client.h 252 2006-01-02 21:50:26Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,11 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.6 2006/01/02 21:50:26 fraggle
+// Restructure the waiting screen code. Establish our own separate event
+// loop while waiting for the game to start, to avoid affecting the original
+// code too much. Move some _gui variables to net_client.c.
+//
// Revision 1.5 2006/01/02 00:00:08 fraggle
// Neater prefixes: NET_Client -> NET_CL_. NET_Server -> NET_SV_.
//
@@ -46,11 +51,17 @@
#ifndef NET_CLIENT_H
#define NET_CLIENT_H
+#include "doomtype.h"
#include "net_defs.h"
boolean NET_CL_Connect(net_addr_t *addr);
void NET_CL_Disconnect(void);
void NET_CL_Run(void);
+
+extern boolean net_client_connected;
+extern boolean net_client_controller;
+extern int net_clients_in_game;
+extern boolean net_waiting_for_start;
#endif /* #ifndef NET_CLIENT_H */
--- a/src/net_gui.c
+++ b/src/net_gui.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: net_gui.c 235 2005-12-30 18:58:22Z fraggle $
+// $Id: net_gui.c 252 2006-01-02 21:50:26Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,11 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.2 2006/01/02 21:50:26 fraggle
+// Restructure the waiting screen code. Establish our own separate event
+// loop while waiting for the game to start, to avoid affecting the original
+// code too much. Move some _gui variables to net_client.c.
+//
// Revision 1.1 2005/12/30 18:58:22 fraggle
// Fix client code to correctly send reply to server on connection.
// Add "waiting screen" while waiting for the game to start.
@@ -33,8 +38,15 @@
// start the game.
//
+#include "net_client.h"
#include "net_gui.h"
+#include "net_server.h"
+
#include "d_event.h"
+#include "d_main.h"
+#include "i_system.h"
+#include "i_video.h"
+#include "m_menu.h"
#include "r_defs.h"
#include "v_video.h"
#include "w_wad.h"
@@ -42,15 +54,7 @@
extern void M_WriteText(int x, int y, char *string);
-// if TRUE, this client is the controller of the game
-
-boolean net_client_controller = false;
-
-// Number of clients currently connected to the server
-
-int net_clients_in_game;
-
-void NET_Drawer(void)
+static void Drawer(void)
{
patch_t *backdrop;
int backdrop_lumpnum;
@@ -85,8 +89,78 @@
}
}
-boolean NET_Responder(event_t *event)
+static void ProcessEvents(void)
{
- return true;
+ event_t *ev;
+
+ while ((ev = D_PopEvent()) != NULL)
+ {
+ if (M_Responder(ev))
+ {
+ continue;
+ }
+
+ // process event ...
+ }
+}
+
+// Displays a graphical screen while waiting for the game to start.
+
+void NET_WaitForStart(void)
+{
+ int last_tic_time;
+ int nowtime;
+ int runtics;
+ int i;
+
+ if (!net_client_connected || !net_waiting_for_start)
+ {
+ return;
+ }
+
+ last_tic_time = I_GetTime();
+
+ while (net_waiting_for_start)
+ {
+ // Keyboard/mouse events, etc.
+
+ I_StartTic();
+ ProcessEvents();
+
+ // Run the menu, etc.
+
+ nowtime = I_GetTime();
+ runtics = nowtime - last_tic_time;
+
+ if (runtics > 0)
+ {
+ for (i=0; i<runtics; ++i)
+ {
+ M_Ticker();
+ }
+
+ last_tic_time = nowtime;
+
+ // Draw the screen
+
+ Drawer();
+ M_Drawer();
+ I_FinishUpdate();
+ }
+
+ // Network stuff
+
+ NET_CL_Run();
+ NET_SV_Run();
+
+ if (!net_client_connected)
+ {
+ I_Error("Disconnected from server");
+ }
+
+ // Don't hog the CPU
+
+ I_Sleep(10);
+ }
}
--- a/src/net_gui.h
+++ b/src/net_gui.h
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: net_gui.h 235 2005-12-30 18:58:22Z fraggle $
+// $Id: net_gui.h 252 2006-01-02 21:50:26Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,11 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.2 2006/01/02 21:50:26 fraggle
+// Restructure the waiting screen code. Establish our own separate event
+// loop while waiting for the game to start, to avoid affecting the original
+// code too much. Move some _gui variables to net_client.c.
+//
// Revision 1.1 2005/12/30 18:58:22 fraggle
// Fix client code to correctly send reply to server on connection.
// Add "waiting screen" while waiting for the game to start.
@@ -38,13 +43,8 @@
#define NET_GUI_H
#include "doomtype.h"
-#include "d_event.h"
-extern void NET_Drawer(void);
-extern boolean NET_Responder(event_t *event);
-
-extern boolean net_client_controller;
-extern int net_clients_in_game;
+extern void NET_WaitForStart();
#endif /* #ifndef NET_GUI_H */