ref: a4567e04c7f90f12ae7e2bedf840d80e14409283
parent: e5806af05eb31c18250bf74c9b8ae052a0666b6b
author: Simon Howard <fraggle@gmail.com>
date: Wed Oct 19 14:10:11 EDT 2011
Change MAXPLAYERS to NET_MAXPLAYERS and add back individual MAXPLAYERS defines for each game. Refactor "waiting screen" data code. Subversion-branch: /branches/v2-branch Subversion-revision: 2441
--- a/src/d_loop.c
+++ b/src/d_loop.c
@@ -52,8 +52,8 @@
typedef struct
{
- ticcmd_t cmds[MAXPLAYERS];
- boolean ingame[MAXPLAYERS];
+ ticcmd_t cmds[NET_MAXPLAYERS];
+ boolean ingame[NET_MAXPLAYERS];
} ticcmd_set_t;
//
@@ -113,7 +113,7 @@
// This is distinct from playeringame[] used by the game code, which may
// modify playeringame[] when playing back multiplayer demos.
-static boolean local_playeringame[MAXPLAYERS];
+static boolean local_playeringame[NET_MAXPLAYERS];
// 35 fps clock adjusted by offsetms milliseconds
@@ -282,7 +282,7 @@
return;
}
- for (i = 0; i < MAXPLAYERS; ++i)
+ for (i = 0; i < NET_MAXPLAYERS; ++i)
{
if (!drone && i == localplayer)
{
@@ -457,7 +457,7 @@
localplayer = settings->consoleplayer;
- for (i = 0; i < MAXPLAYERS; ++i)
+ for (i = 0; i < NET_MAXPLAYERS; ++i)
{
local_playeringame[i] = i < settings->num_players;
}
@@ -524,7 +524,7 @@
// ideally maketic should be 1 - 3 tics above lowtic
// if we are consistantly slower, speed up time
- for (i=0 ; i<MAXPLAYERS ; i++)
+ for (i=0 ; i<NET_MAXPLAYERS ; i++)
{
if (local_playeringame[i])
{
@@ -575,7 +575,7 @@
if (net_client_connected)
{
- for (i = 0; i < MAXPLAYERS; ++i)
+ for (i = 0; i < NET_MAXPLAYERS; ++i)
{
result = result || local_playeringame[i];
}
@@ -600,7 +600,7 @@
ticcmd_t *cmd;
unsigned int i;
- for (i = 0; i < MAXPLAYERS ; ++i)
+ for (i = 0; i < NET_MAXPLAYERS ; ++i)
{
cmd = &set->cmds[i];
cmd->chatchar = 0;
@@ -616,7 +616,7 @@
{
unsigned int i;
- for (i = 0; i < MAXPLAYERS; ++i)
+ for (i = 0; i < NET_MAXPLAYERS; ++i)
{
if (i != localplayer)
{
@@ -750,4 +750,3 @@
{
loop_interface = i;
}
-
--- a/src/doom/doomdef.h
+++ b/src/doom/doomdef.h
@@ -49,6 +49,9 @@
// most parameter validation debugging code will not be compiled
#define RANGECHECK
+// The maximum number of players, multiplayer/networking.
+#define MAXPLAYERS 4
+
// The current state of the game: whether we are
// playing, gazing at the intermission screen,
// the game final animation, or a demo.
@@ -171,4 +174,3 @@
} powerduration_t;
#endif // __DOOMDEF__
-
--- a/src/heretic/doomdef.h
+++ b/src/heretic/doomdef.h
@@ -78,6 +78,7 @@
*/
#define NUMARTIFCTS 28
+#define MAXPLAYERS 4
#define BT_ATTACK 1
#define BT_USE 2
--- a/src/hexen/g_game.c
+++ b/src/hexen/g_game.c
@@ -1815,6 +1815,7 @@
playeringame[i] = *demo_p++;
PlayerClass[i] = *demo_p++;
}
+ demo_p += 8;
// Initialize world info, etc.
G_StartNewInit();
--- a/src/hexen/h2def.h
+++ b/src/hexen/h2def.h
@@ -98,6 +98,7 @@
*/
//#define NUMARTIFCTS 28
+#define MAXPLAYERS 8
#define BT_ATTACK 1
#define BT_USE 2
--- a/src/net_client.c
+++ b/src/net_client.c
@@ -118,37 +118,8 @@
boolean net_client_received_wait_data;
-// if true, this client is the controller of the game
+net_waitdata_t net_client_wait_data;
-boolean net_client_controller = false;
-
-// Number of clients currently connected to the server
-
-unsigned int net_clients_in_game;
-
-// Number of drone players connected to the server
-
-unsigned int net_drones_in_game;
-
-// Names of all players
-
-char net_player_addresses[MAXPLAYERS][MAXPLAYERNAME];
-char net_player_names[MAXPLAYERS][MAXPLAYERNAME];
-
-// MD5 checksums of the wad directory and dehacked data that the server
-// has sent to us.
-
-md5_digest_t net_server_wad_md5sum;
-md5_digest_t net_server_deh_md5sum;
-
-// Is the server a freedoom game?
-
-unsigned int net_server_is_freedoom;
-
-// Player number
-
-int net_player_number;
-
// Waiting for the game to start?
boolean net_waiting_for_start = false;
@@ -171,7 +142,7 @@
// Receive window
-static ticcmd_t recvwindow_cmd_base[MAXPLAYERS];
+static ticcmd_t recvwindow_cmd_base[NET_MAXPLAYERS];
static int recvwindow_start;
static net_server_recv_t recvwindow[BACKUPTICS];
@@ -269,7 +240,7 @@
// Expand tic diffs for all players
- for (i=0; i<MAXPLAYERS; ++i)
+ for (i=0; i<NET_MAXPLAYERS; ++i)
{
if (i == settings.consoleplayer && !drone)
{
@@ -298,7 +269,7 @@
static void NET_CL_AdvanceWindow(void)
{
- ticcmd_t ticcmds[MAXPLAYERS];
+ ticcmd_t ticcmds[NET_MAXPLAYERS];
while (recvwindow[0].active)
{
@@ -456,27 +427,16 @@
static void NET_CL_ParseWaitingData(net_packet_t *packet)
{
- unsigned int num_players;
- unsigned int num_drones;
- unsigned int is_controller;
- signed int player_number;
- char *player_names[MAXPLAYERS];
- char *player_addr[MAXPLAYERS];
- md5_digest_t wad_md5sum, deh_md5sum;
- unsigned int server_is_freedoom;
- size_t i;
+ net_waitdata_t wait_data;
- if (!NET_ReadInt8(packet, &num_players)
- || !NET_ReadInt8(packet, &num_drones)
- || !NET_ReadInt8(packet, &is_controller)
- || !NET_ReadSInt8(packet, &player_number))
+ if (!NET_ReadWaitData(packet, &wait_data))
{
- // invalid packet
-
+ // Invalid packet?
return;
}
- if (num_players > MAXPLAYERS)
+ if (wait_data.num_players > wait_data.max_players
+ || wait_data.max_players > NET_MAXPLAYERS)
{
// insane data
@@ -483,52 +443,16 @@
return;
}
- if ((player_number >= 0 && drone)
- || (player_number < 0 && !drone)
- || (player_number >= (signed int) num_players))
+ if ((wait_data.consoleplayer >= 0 && drone)
+ || (wait_data.consoleplayer < 0 && !drone)
+ || (wait_data.consoleplayer >= wait_data.num_players))
{
// Invalid player number
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;
- }
- }
-
- if (!NET_ReadMD5Sum(packet, wad_md5sum)
- || !NET_ReadMD5Sum(packet, deh_md5sum)
- || !NET_ReadInt8(packet, &server_is_freedoom))
- {
- return;
- }
-
- net_clients_in_game = num_players;
- net_drones_in_game = num_drones;
- net_client_controller = is_controller != 0;
- net_player_number = player_number;
-
- 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';
- }
-
- memcpy(net_server_wad_md5sum, wad_md5sum, sizeof(md5_digest_t));
- memcpy(net_server_deh_md5sum, deh_md5sum, sizeof(md5_digest_t));
- net_server_is_freedoom = server_is_freedoom;
-
+ memcpy(&net_client_wait_data, &wait_data, sizeof(net_waitdata_t));
net_client_received_wait_data = true;
}
@@ -544,7 +468,7 @@
return;
}
- if (settings.num_players > MAXPLAYERS
+ if (settings.num_players > NET_MAXPLAYERS
|| settings.consoleplayer >= (signed int) settings.num_players)
{
// insane values
--- a/src/net_client.h
+++ b/src/net_client.h
@@ -29,8 +29,6 @@
#include "md5.h"
#include "net_defs.h"
-#define MAXPLAYERNAME 30
-
boolean NET_CL_Connect(net_addr_t *addr, net_connect_data_t *data);
void NET_CL_Disconnect(void);
void NET_CL_Run(void);
@@ -44,13 +42,8 @@
extern boolean net_client_connected;
extern boolean net_client_received_wait_data;
-extern boolean net_client_controller;
-extern unsigned int net_clients_in_game;
-extern unsigned int net_drones_in_game;
+extern net_waitdata_t net_client_wait_data;
extern boolean net_waiting_for_start;
-extern char net_player_names[MAXPLAYERS][MAXPLAYERNAME];
-extern char net_player_addresses[MAXPLAYERS][MAXPLAYERNAME];
-extern int net_player_number;
extern char *net_player_name;
extern md5_digest_t net_server_wad_md5sum;
@@ -63,4 +56,3 @@
extern boolean drone;
#endif /* #ifndef NET_CLIENT_H */
-
--- a/src/net_defs.h
+++ b/src/net_defs.h
@@ -33,18 +33,24 @@
#include "md5.h"
// Absolute maximum number of "nodes" in the game. This is different to
-// MAXPLAYERS, as there may be observers that are not participating
+// NET_MAXPLAYERS, as there may be observers that are not participating
// (eg. left/right monitors)
#define MAXNETNODES 16
// The maximum number of players, multiplayer/networking.
+// This is the maximum supported by the networking code; individual games
+// have their own values for MAXPLAYERS that can be smaller.
-#define MAXPLAYERS 4
+#define NET_MAXPLAYERS 8
+// Maximum length of a player's name.
+
+#define MAXPLAYERNAME 30
+
// Networking and tick handling related.
-#define BACKUPTICS 128
+#define BACKUPTICS 128
typedef struct _net_module_s net_module_t;
typedef struct _net_packet_s net_packet_t;
@@ -179,7 +185,7 @@
// Hexen player classes:
- int player_classes[MAXPLAYERS];
+ int player_classes[NET_MAXPLAYERS];
} net_gamesettings_t;
@@ -204,8 +210,8 @@
{
signed int latency;
unsigned int seq;
- boolean playeringame[MAXPLAYERS];
- net_ticdiff_t cmds[MAXPLAYERS];
+ boolean playeringame[NET_MAXPLAYERS];
+ net_ticdiff_t cmds[NET_MAXPLAYERS];
} net_full_ticcmd_t;
// Data sent in response to server queries
@@ -220,5 +226,21 @@
int gamemission;
char *description;
} net_querydata_t;
+
+// Data sent by the server while waiting for the game to start.
+
+typedef struct
+{
+ int num_players;
+ int num_drones;
+ int max_players;
+ int is_controller;
+ int consoleplayer;
+ char player_names[NET_MAXPLAYERS][MAXPLAYERNAME];
+ char player_addrs[NET_MAXPLAYERS][MAXPLAYERNAME];
+ md5_digest_t wad_md5sum;
+ md5_digest_t deh_md5sum;
+ int is_freedoom;
+} net_waitdata_t;
#endif /* #ifndef NET_DEFS_H */
--- a/src/net_gui.c
+++ b/src/net_gui.c
@@ -42,8 +42,8 @@
#include "textscreen.h"
static txt_window_t *window;
-static txt_label_t *player_labels[MAXPLAYERS];
-static txt_label_t *ip_labels[MAXPLAYERS];
+static txt_label_t *player_labels[NET_MAXPLAYERS];
+static txt_label_t *ip_labels[NET_MAXPLAYERS];
static txt_label_t *drone_label;
static boolean had_warning;
@@ -83,7 +83,7 @@
// Player labels
- for (i=0; i<MAXPLAYERS; ++i)
+ for (i=0; i<NET_MAXPLAYERS; ++i)
{
sprintf(buf, " %i. ", i + 1);
TXT_AddWidget(table, TXT_NewLabel(buf));
@@ -109,11 +109,11 @@
char buf[50];
unsigned int i;
- for (i=0; i<MAXPLAYERS; ++i)
+ for (i=0; i<NET_MAXPLAYERS; ++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;
}
@@ -121,10 +121,12 @@
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
{
@@ -133,9 +135,10 @@
}
}
- 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
@@ -143,7 +146,7 @@
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, settings);
@@ -181,11 +184,13 @@
return;
}
- correct_wad = memcmp(net_local_wad_md5sum, net_server_wad_md5sum,
+ correct_wad = memcmp(net_local_wad_md5sum,
+ net_client_wait_data.wad_md5sum,
sizeof(md5_digest_t)) == 0;
- correct_deh = memcmp(net_local_deh_md5sum, net_server_deh_md5sum,
+ correct_deh = memcmp(net_local_deh_md5sum,
+ net_client_wait_data.deh_md5sum,
sizeof(md5_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)
{
@@ -196,7 +201,7 @@
{
printf("Warning: WAD MD5 does not match server:\n");
PrintMD5Digest("Local", net_local_wad_md5sum);
- PrintMD5Digest("Server", net_server_wad_md5sum);
+ PrintMD5Digest("Server", net_client_wait_data.wad_md5sum);
}
if (!same_freedoom)
@@ -204,7 +209,7 @@
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)
@@ -211,7 +216,7 @@
{
printf("Warning: Dehacked MD5 does not match server:\n");
PrintMD5Digest("Local", net_local_deh_md5sum);
- PrintMD5Digest("Server", net_server_deh_md5sum);
+ PrintMD5Digest("Server", net_client_wait_data.deh_md5sum);
}
window = TXT_NewWindow("WARNING");
@@ -295,4 +300,3 @@
TXT_Shutdown();
}
-
--- a/src/net_server.c
+++ b/src/net_server.c
@@ -136,7 +136,7 @@
static net_server_state_t server_state;
static boolean server_initialized = false;
static net_client_t clients[MAXNETNODES];
-static net_client_t *sv_players[MAXPLAYERS];
+static net_client_t *sv_players[NET_MAXPLAYERS];
static net_context_t *server_context;
static unsigned int sv_gamemode;
static unsigned int sv_gamemission;
@@ -150,7 +150,7 @@
// receive window
static unsigned int recvwindow_start;
-static net_client_recv_t recvwindow[BACKUPTICS][MAXPLAYERS];
+static net_client_recv_t recvwindow[BACKUPTICS][NET_MAXPLAYERS];
#define NET_SV_ExpandTicNum(b) NET_ExpandTicNum(recvwindow_start, (b))
@@ -239,7 +239,7 @@
}
}
- for (; pl<MAXPLAYERS; ++pl)
+ for (; pl<NET_MAXPLAYERS; ++pl)
{
sv_players[pl] = NULL;
}
@@ -254,7 +254,7 @@
result = 0;
- for (i=0; i<MAXPLAYERS; ++i)
+ for (i=0; i<NET_MAXPLAYERS; ++i)
{
if (sv_players[i] != NULL && ClientConnected(sv_players[i]))
{
@@ -354,7 +354,7 @@
should_advance = true;
- for (i=0; i<MAXPLAYERS; ++i)
+ for (i=0; i<NET_MAXPLAYERS; ++i)
{
if (sv_players[i] == NULL || !ClientConnected(sv_players[i]))
{
@@ -599,7 +599,7 @@
NET_SV_AssignPlayers();
num_players = NET_SV_NumPlayers();
- if ((!data.drone && num_players >= MAXPLAYERS)
+ if ((!data.drone && num_players >= NET_MAXPLAYERS)
|| NET_SV_NumClients() >= MAXNETNODES)
{
NET_SV_SendReject(addr, "Server is full!");
@@ -694,7 +694,7 @@
settings.lowres_turn = false;
- for (i=0; i<MAXPLAYERS; ++i)
+ for (i=0; i<NET_MAXPLAYERS; ++i)
{
if (sv_players[i] != NULL && sv_players[i]->recording_lowres)
{
@@ -706,7 +706,7 @@
// Copy player classes:
- for (i = 0; i < MAXPLAYERS; ++i)
+ for (i = 0; i < NET_MAXPLAYERS; ++i)
{
if (sv_players[i] != NULL)
{
@@ -1120,7 +1120,7 @@
// Number of players/maximum players
querydata.num_players = NET_SV_NumPlayers();
- querydata.max_players = MAXPLAYERS;
+ querydata.max_players = NET_MAXPLAYERS;
// Game mode/mission
@@ -1234,9 +1234,9 @@
static void NET_SV_SendWaitingData(net_client_t *client)
{
+ net_waitdata_t wait_data;
net_packet_t *packet;
net_client_t *controller;
- int num_players;
int i;
NET_SV_AssignPlayers();
@@ -1243,62 +1243,49 @@
controller = NET_SV_Controller();
- num_players = NET_SV_NumPlayers();
+ wait_data.num_players = NET_SV_NumPlayers();
+ wait_data.num_drones = NET_SV_NumDrones();
+ wait_data.max_players = NET_MAXPLAYERS;
+ wait_data.is_controller = (client == controller);
+ wait_data.consoleplayer = client->player_number;
- // time to send the client another status packet
+ // Send the WAD and dehacked checksums of the controlling client.
+ // If no controller found (?), send the details that the client
+ // is expecting anyway.
- packet = NET_NewPacket(10);
- NET_WriteInt16(packet, NET_PACKET_TYPE_WAITING_DATA);
+ if (controller != NULL)
+ {
+ controller = client;
+ }
- // include the number of players waiting
+ memcpy(&wait_data.wad_md5sum, &controller->wad_md5sum,
+ sizeof(md5_digest_t));
+ memcpy(&wait_data.deh_md5sum, &controller->deh_md5sum,
+ sizeof(md5_digest_t));
+ wait_data.is_freedoom = controller->is_freedoom;
- NET_WriteInt8(packet, num_players);
+ // set name and address of each player:
- // send the number of drone clients
-
- NET_WriteInt8(packet, NET_SV_NumDrones());
-
- // indicate whether the client is the controller
-
- NET_WriteInt8(packet, client == controller);
-
- // send the player number of this client
-
- NET_WriteInt8(packet, client->player_number);
-
- // send the addresses of all players
-
- for (i=0; i<num_players; ++i)
+ for (i = 0; i < wait_data.num_players; ++i)
{
- char *addr;
+ strncpy(wait_data.player_names[i],
+ sv_players[i]->name,
+ MAXPLAYERNAME);
+ wait_data.player_names[i][MAXPLAYERNAME-1] = '\0';
- // name
-
- NET_WriteString(packet, sv_players[i]->name);
-
- // address
-
- addr = NET_AddrToString(sv_players[i]->addr);
-
- NET_WriteString(packet, addr);
+ strncpy(wait_data.player_addrs[i],
+ NET_AddrToString(sv_players[i]->addr),
+ MAXPLAYERNAME);
+ wait_data.player_addrs[i][MAXPLAYERNAME-1] = '\0';
}
- // Send the WAD and dehacked checksums of the controlling client.
+ // Construct packet:
- if (controller != NULL)
- {
- NET_WriteMD5Sum(packet, controller->wad_md5sum);
- NET_WriteMD5Sum(packet, controller->deh_md5sum);
- NET_WriteInt8(packet, controller->is_freedoom);
- }
- else
- {
- NET_WriteMD5Sum(packet, client->wad_md5sum);
- NET_WriteMD5Sum(packet, client->deh_md5sum);
- NET_WriteInt8(packet, client->is_freedoom);
- }
+ packet = NET_NewPacket(10);
+ NET_WriteInt16(packet, NET_PACKET_TYPE_WAITING_DATA);
+ NET_WriteWaitData(packet, &wait_data);
- // send packet to client and free
+ // Send packet to client and free
NET_Conn_SendPacket(&client->connection, packet);
NET_FreePacket(packet);
@@ -1334,7 +1321,7 @@
num_players = 0;
- for (i=0; i<MAXPLAYERS; ++i)
+ for (i=0; i<NET_MAXPLAYERS; ++i)
{
if (sv_players[i] == client)
{
@@ -1380,7 +1367,7 @@
cmd.latency = 0;
- for (i=0; i<MAXPLAYERS; ++i)
+ for (i=0; i<NET_MAXPLAYERS; ++i)
{
net_client_recv_t *recvobj;
@@ -1660,7 +1647,7 @@
{
NET_SV_AdvanceWindow();
- for (i=0; i<MAXPLAYERS; ++i)
+ for (i=0; i<NET_MAXPLAYERS; ++i)
{
if (sv_players[i] != NULL && ClientConnected(sv_players[i]))
{
--- a/src/net_structrw.c
+++ b/src/net_structrw.c
@@ -31,34 +31,6 @@
#include "net_packet.h"
#include "net_structrw.h"
-static void NET_WriteMD5(net_packet_t *packet, md5_digest_t digest)
-{
- int i;
-
- for (i = 0; i < sizeof(md5_digest_t); ++i)
- {
- NET_WriteInt8(packet, digest[i]);
- }
-}
-
-static boolean NET_ReadMD5(net_packet_t *packet, md5_digest_t digest)
-{
- unsigned int val;
- int i;
-
- for (i = 0; i < sizeof(md5_digest_t); ++i)
- {
- if (!NET_ReadInt8(packet, &val))
- {
- return false;
- }
-
- digest[i] = (uint8_t) val;
- }
-
- return true;
-}
-
void NET_WriteConnectData(net_packet_t *packet, net_connect_data_t *data)
{
NET_WriteInt8(packet, data->gamemode);
@@ -66,8 +38,8 @@
NET_WriteInt8(packet, data->lowres_turn);
NET_WriteInt8(packet, data->drone);
NET_WriteInt8(packet, data->is_freedoom);
- NET_WriteMD5(packet, data->wad_md5sum);
- NET_WriteMD5(packet, data->deh_md5sum);
+ NET_WriteMD5Sum(packet, data->wad_md5sum);
+ NET_WriteMD5Sum(packet, data->deh_md5sum);
NET_WriteInt8(packet, data->player_class);
}
@@ -78,8 +50,8 @@
&& NET_ReadInt8(packet, (unsigned int *) &data->lowres_turn)
&& NET_ReadInt8(packet, (unsigned int *) &data->drone)
&& NET_ReadInt8(packet, (unsigned int *) &data->is_freedoom)
- && NET_ReadMD5(packet, data->wad_md5sum)
- && NET_ReadMD5(packet, data->deh_md5sum)
+ && NET_ReadMD5Sum(packet, data->wad_md5sum)
+ && NET_ReadMD5Sum(packet, data->deh_md5sum)
&& NET_ReadInt8(packet, (unsigned int *) &data->player_class);
}
@@ -415,7 +387,7 @@
return false;
}
- for (i=0; i<MAXPLAYERS; ++i)
+ for (i=0; i<NET_MAXPLAYERS; ++i)
{
cmd->playeringame[i] = (bitfield & (1 << i)) != 0;
}
@@ -422,7 +394,7 @@
// Read cmds
- for (i=0; i<MAXPLAYERS; ++i)
+ for (i=0; i<NET_MAXPLAYERS; ++i)
{
if (cmd->playeringame[i])
{
@@ -450,7 +422,7 @@
bitfield = 0;
- for (i=0; i<MAXPLAYERS; ++i)
+ for (i=0; i<NET_MAXPLAYERS; ++i)
{
if (cmd->playeringame[i])
{
@@ -462,7 +434,7 @@
// Write player ticcmds
- for (i=0; i<MAXPLAYERS; ++i)
+ for (i=0; i<NET_MAXPLAYERS; ++i)
{
if (cmd->playeringame[i])
{
@@ -469,6 +441,67 @@
NET_WriteTiccmdDiff(packet, &cmd->cmds[i], lowres_turn);
}
}
+}
+
+void NET_WriteWaitData(net_packet_t *packet, net_waitdata_t *data)
+{
+ int i;
+
+ NET_WriteInt8(packet, data->num_players);
+ NET_WriteInt8(packet, data->num_drones);
+ NET_WriteInt8(packet, data->max_players);
+ NET_WriteInt8(packet, data->is_controller);
+ NET_WriteInt8(packet, data->consoleplayer);
+
+ for (i = 0; i < data->num_players && i < NET_MAXPLAYERS; ++i)
+ {
+ NET_WriteString(packet, data->player_names[i]);
+ NET_WriteString(packet, data->player_addrs[i]);
+ }
+
+ NET_WriteMD5Sum(packet, data->wad_md5sum);
+ NET_WriteMD5Sum(packet, data->deh_md5sum);
+ NET_WriteInt8(packet, data->is_freedoom);
+}
+
+boolean NET_ReadWaitData(net_packet_t *packet, net_waitdata_t *data)
+{
+ int i;
+ char *s;
+
+ if (!NET_ReadInt8(packet, (unsigned int *) &data->num_players)
+ || !NET_ReadInt8(packet, (unsigned int *) &data->num_drones)
+ || !NET_ReadInt8(packet, (unsigned int *) &data->max_players)
+ || !NET_ReadInt8(packet, (unsigned int *) &data->is_controller)
+ || !NET_ReadSInt8(packet, (unsigned int *) &data->consoleplayer))
+ {
+ return false;
+ }
+
+ for (i = 0; i < data->num_players && i < NET_MAXPLAYERS; ++i)
+ {
+ s = NET_ReadString(packet);
+
+ if (s == NULL || strlen(s) >= MAXPLAYERNAME)
+ {
+ return false;
+ }
+
+ strcpy(data->player_names[i], s);
+
+ s = NET_ReadString(packet);
+
+ if (s == NULL || strlen(s) >= MAXPLAYERNAME)
+ {
+ return false;
+ }
+
+ strcpy(data->player_addrs[i], s);
+ }
+
+ return NET_ReadMD5Sum(packet, data->wad_md5sum)
+ && NET_ReadMD5Sum(packet, data->deh_md5sum)
+ && NET_ReadInt8(packet, (unsigned int *) &data->is_freedoom);
}
boolean NET_ReadMD5Sum(net_packet_t *packet, md5_digest_t digest)
--- a/src/net_structrw.h
+++ b/src/net_structrw.h
@@ -46,7 +46,9 @@
boolean NET_ReadMD5Sum(net_packet_t *packet, md5_digest_t digest);
void NET_WriteMD5Sum(net_packet_t *packet, md5_digest_t digest);
+void NET_WriteWaitData(net_packet_t *packet, net_waitdata_t *data);
+boolean NET_ReadWaitData(net_packet_t *packet, net_waitdata_t *data);
+
void NET_SafePuts(char *msg);
#endif /* #ifndef NET_STRUCTRW_H */
-
--- a/src/strife/doomdef.h
+++ b/src/strife/doomdef.h
@@ -47,6 +47,9 @@
#define DOOM_191_VERSION 111
+// Maximum players for Strife:
+#define MAXPLAYERS 8
+
// If rangecheck is undefined,
// most parameter validation debugging code will not be compiled
#define RANGECHECK
@@ -294,4 +297,3 @@
} powerduration_t;
#endif // __DOOMDEF__
-