diff options
-rw-r--r-- | src/net_client.c | 42 | ||||
-rw-r--r-- | src/net_client.h | 11 | ||||
-rw-r--r-- | src/net_gui.c | 49 | ||||
-rw-r--r-- | src/net_server.c | 29 |
4 files changed, 122 insertions, 9 deletions
diff --git a/src/net_client.c b/src/net_client.c index fc3082fa..7628530e 100644 --- a/src/net_client.c +++ b/src/net_client.c @@ -1,7 +1,7 @@ // Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // -// $Id: net_client.c 252 2006-01-02 21:50:26Z fraggle $ +// $Id: net_client.c 262 2006-01-07 20:08:11Z fraggle $ // // Copyright(C) 2005 Simon Howard // @@ -21,6 +21,10 @@ // 02111-1307, USA. // // $Log$ +// Revision 1.9 2006/01/07 20:08:11 fraggle +// Send player name and address in the waiting data packets. Display these +// on the waiting screen, and improve the waiting screen appearance. +// // 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 @@ -105,6 +109,11 @@ boolean net_client_controller = false; int net_clients_in_game; +// Nmaes of all players + +char net_player_addresses[MAXPLAYERS][MAXPLAYERNAME]; +char net_player_names[MAXPLAYERS][MAXPLAYERNAME]; + // Waiting for the game to start? boolean net_waiting_for_start = false; @@ -126,6 +135,9 @@ static void NET_CL_ParseWaitingData(net_packet_t *packet) { unsigned int num_players; unsigned int is_controller; + char *player_names[MAXPLAYERS]; + char *player_addr[MAXPLAYERS]; + int i; if (!NET_ReadInt8(packet, &num_players) || !NET_ReadInt8(packet, &is_controller)) @@ -135,8 +147,36 @@ static void NET_CL_ParseWaitingData(net_packet_t *packet) return; } + if (num_players > MAXPLAYERS) + { + // Invalid number of players + + return; + } + + // Read the player names + + for (i=0; i<num_players; ++i) + { + player_names[i] = NET_ReadString(packet); + player_addr[i] = NET_ReadString(packet); + + if (player_names[i] == NULL || player_addr[i] == NULL) + { + return; + } + } + net_clients_in_game = num_players; net_client_controller = is_controller != 0; + + for (i=0; i<num_players; ++i) + { + strncpy(net_player_names[i], player_names[i], MAXPLAYERNAME); + net_player_names[i][MAXPLAYERNAME-1] = '\0'; + strncpy(net_player_addresses[i], player_addr[i], MAXPLAYERNAME); + net_player_addresses[i][MAXPLAYERNAME-1] = '\0'; + } } // Received an ACK diff --git a/src/net_client.h b/src/net_client.h index 2723eab6..9200e167 100644 --- a/src/net_client.h +++ b/src/net_client.h @@ -1,7 +1,7 @@ // Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // -// $Id: net_client.h 252 2006-01-02 21:50:26Z fraggle $ +// $Id: net_client.h 262 2006-01-07 20:08:11Z fraggle $ // // Copyright(C) 2005 Simon Howard // @@ -21,6 +21,10 @@ // 02111-1307, USA. // // $Log$ +// Revision 1.7 2006/01/07 20:08:11 fraggle +// Send player name and address in the waiting data packets. Display these +// on the waiting screen, and improve the waiting screen appearance. +// // 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 @@ -51,9 +55,12 @@ #ifndef NET_CLIENT_H #define NET_CLIENT_H +#include "doomdef.h" #include "doomtype.h" #include "net_defs.h" +#define MAXPLAYERNAME 30 + boolean NET_CL_Connect(net_addr_t *addr); void NET_CL_Disconnect(void); void NET_CL_Run(void); @@ -62,6 +69,8 @@ extern boolean net_client_connected; extern boolean net_client_controller; extern int net_clients_in_game; extern boolean net_waiting_for_start; +extern char net_player_names[MAXPLAYERS][MAXPLAYERNAME]; +extern char net_player_addresses[MAXPLAYERS][MAXPLAYERNAME]; #endif /* #ifndef NET_CLIENT_H */ diff --git a/src/net_gui.c b/src/net_gui.c index c251eab9..7a41f217 100644 --- a/src/net_gui.c +++ b/src/net_gui.c @@ -1,7 +1,7 @@ // Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // -// $Id: net_gui.c 252 2006-01-02 21:50:26Z fraggle $ +// $Id: net_gui.c 262 2006-01-07 20:08:11Z fraggle $ // // Copyright(C) 2005 Simon Howard // @@ -21,6 +21,10 @@ // 02111-1307, USA. // // $Log$ +// Revision 1.3 2006/01/07 20:08:11 fraggle +// Send player name and address in the waiting data packets. Display these +// on the waiting screen, and improve the waiting screen appearance. +// // 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 @@ -52,6 +56,9 @@ #include "w_wad.h" #include "z_zone.h" +static patch_t *player_face; +static patch_t *player_backdrops[4]; + extern void M_WriteText(int x, int y, char *string); static void Drawer(void) @@ -59,6 +66,7 @@ static void Drawer(void) patch_t *backdrop; int backdrop_lumpnum; char buf[128]; + int i, y; // Use INTERPIC or TITLEPIC if we don't have it @@ -75,17 +83,32 @@ static void Drawer(void) V_DrawPatch(0, 0, 0, backdrop); - sprintf(buf, "%i clients connected to server.", net_clients_in_game); + // draw players - M_WriteText(32, 100, buf); + y = 100 - 16 * net_clients_in_game - 24; + + M_WriteText(32, y, "Players currently waiting:"); + + y += 24; + + for (i=0; i<net_clients_in_game; ++i) + { + V_DrawPatch(32, y, 0, player_backdrops[i]); + V_DrawPatch(32, y, 0, player_face); + M_WriteText(80, y+12, net_player_names[i]); + M_WriteText(200, y+12, net_player_addresses[i]); + y += 32; + } + + y += 16; if (net_client_controller) { - M_WriteText(32, 150, "Press space to start the game..."); + M_WriteText(32, y, "Press space to start the game..."); } else { - M_WriteText(32, 150, "Waiting for the game to start..."); + M_WriteText(32, y, "Waiting for the game to start..."); } } @@ -104,6 +127,20 @@ static void ProcessEvents(void) } } +static void NET_InitGUI(void) +{ + char buf[8]; + int i; + + player_face = W_CacheLumpName("STFST01", PU_STATIC); + + for (i=0 ; i<MAXPLAYERS ; i++) + { + sprintf(buf, "STPB%d", i); + player_backdrops[i] = W_CacheLumpName(buf, PU_STATIC); + } +} + // Displays a graphical screen while waiting for the game to start. void NET_WaitForStart(void) @@ -118,6 +155,8 @@ void NET_WaitForStart(void) return; } + NET_InitGUI(); + last_tic_time = I_GetTime(); while (net_waiting_for_start) diff --git a/src/net_server.c b/src/net_server.c index 39e6da8a..b50d7035 100644 --- a/src/net_server.c +++ b/src/net_server.c @@ -1,7 +1,7 @@ // Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // -// $Id: net_server.c 251 2006-01-02 21:48:37Z fraggle $ +// $Id: net_server.c 262 2006-01-07 20:08:11Z fraggle $ // // Copyright(C) 2005 Simon Howard // @@ -21,6 +21,10 @@ // 02111-1307, USA. // // $Log$ +// Revision 1.11 2006/01/07 20:08:11 fraggle +// Send player name and address in the waiting data packets. Display these +// on the waiting screen, and improve the waiting screen appearance. +// // Revision 1.10 2006/01/02 21:48:37 fraggle // fix client connected function // @@ -396,6 +400,10 @@ static void NET_SV_Packet(net_packet_t *packet, net_addr_t *addr) static void NET_SV_SendWaitingData(net_client_t *client) { net_packet_t *packet; + int num_clients; + int i; + + num_clients = NET_SV_NumClients(); // time to send the client another status packet @@ -404,11 +412,28 @@ static void NET_SV_SendWaitingData(net_client_t *client) // include the number of clients waiting - NET_WriteInt8(packet, NET_SV_NumClients()); + NET_WriteInt8(packet, num_clients); // indicate whether the client is the controller NET_WriteInt8(packet, NET_SV_Controller() == client); + + // send the address of all players + + for (i=0; i<num_clients; ++i) + { + char *addr; + + // name + + NET_WriteString(packet, "Player"); + + // address + + addr = NET_AddrToString(clients[i].addr); + + NET_WriteString(packet, addr); + } // send packet to client and free |