CnC_Remastered_Collection/REDALERT/TENMGR.CPP

1119 lines
48 KiB
C++

//
// Copyright 2020 Electronic Arts Inc.
//
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is free
// software: you can redistribute it and/or modify it under the terms of
// the GNU General Public License as published by the Free Software Foundation,
// either version 3 of the License, or (at your option) any later version.
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
// in the hope that it will be useful, but with permitted additional restrictions
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
// distributed with this program. You should have received a copy of the
// GNU General Public License along with permitted additional restrictions
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
/***************************************************************************
* *
* Project Name : Command & Conquer *
* *
* File Name : TENMGR.CPP *
* *
* Programmer : Bill R. Randolph *
* *
* Start Date : 06/26/96 *
* *
* Last Update : July 22, 1996 [BRR] *
* *
*-------------------------------------------------------------------------*
* Functions: *
* TenConnManClass::TenConnManClass -- Class constructor *
* TenConnManClass::~TenConnManClass -- Class destructor *
* TenConnManClass::Init -- Inits TEN *
* TenConnManClass::Service -- Service routine *
* TenConnManClass::Send_Private_Message -- Sends a "private" message *
* TenConnManClass::Get_Private_Message -- Gets the next private message *
* TenConnManClass::Send_Global_Message -- Sends a "global" message *
* TenConnManClass::Get_Global_Message -- Gets next global message *
* TenConnManClass::Num_Connections -- Reports # connections *
* TenConnManClass::Connection_ID -- Reports a connection's ID *
* TenConnManClass::Connection_Index -- Gets a connection's index *
* TenConnManClass::Create_Connection -- Creates a new connection *
* TenConnManClass::Delete_Connection -- Deletes a connection *
* TenConnManClass::Connection_Name -- Reports a connection's name *
* TenConnManClass::Connection_Address -- Gets a connection's "address" *
* TenConnManClass::Global_Num_Send -- Reports # outgoing packets *
* TenConnManClass::Global_Num_Receive -- Reports # incoming packets *
* TenConnManClass::Private_Num_Send -- Reports # outgoing packets *
* TenConnManClass::Private_Num_Receive -- Reports # incoming packets *
* TenConnManClass::Flush_All -- Flushes all packets *
* TenConnManClass::Reset_Response_Time -- Does nothing *
* TenConnManClass::Response_Time -- Reports response time *
* TenConnManClass::Set_Timing -- Does nothing *
* TenConnManClass::Configure_Debug -- Does nothing *
* TenConnManClass::Mono_Debug_Print -- Does nothing *
* terminateApp -- Callback: app terminates on error *
* debugMessage -- outputs debug message *
* doAlert -- Outputs debug message *
* doPregameHook -- Callback: game is starting *
* doIncomingPacket -- Callback: packet has arrived *
* doPlayerJoins -- Callback: player joins *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "function.h"
#ifdef WIN32
#define WINDOWS
#endif
#if(TEN)
#include "ten.h"
//**************************************************************************
// Constants
//
const unsigned char kGlobalChannelFlag = 0x80;
const int kMaxPlayers = 8;
//**************************************************************************
// Functions
//
static void terminateApp(void);
static void debugMessage(int msgLevel, char *msg);
static void doAlert(int, int, char *);
static void doPregameHook(char * joinType, char *, char *,
char *, char *, char *);
void doIncomingPacket(int addr, void *buf, size_t size);
void doPlayerEntered(int pid, int isYou, char *, char *, char *, long , char *);
//**************************************************************************
// Globals
//
static int IgnoreIncoming = 0;
/***************************************************************************
* TenConnManClass::TenConnManClass -- Class constructor *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
TenConnManClass::TenConnManClass(void)
{
int i;
IsHost = 0;
GlobalQueue = new CommBufferClass(1, 50, sizeof(GlobalPacketType), 4);
PrivateQueue = new CommBufferClass(1, 50, Session.TenSize, 4);
NumConnections = 0;
for (i = 0; i < MAX_PLAYERS; i++) {
Connections[i] = 0;
ID[i] = 0;
Names[i][0] = 0;
}
} // end of TenConnManClass
/***************************************************************************
* TenConnManClass::~TenConnManClass -- Class destructor *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
TenConnManClass::~TenConnManClass()
{
tenArExitArena();
delete GlobalQueue;
delete PrivateQueue;
} // end of ~TenConnManClass
/***************************************************************************
* TenConnManClass::Init -- Inits TEN *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* 1. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Init(void)
{
//
// set the debugging functions
//
setExitRoutine(terminateApp);
setDebugMsgRoutine(debugMessage);
//
// callback function addresses
//
tenArSetAlertMessageRoutine(doAlert);
tenArSetPregameHookRoutine(doPregameHook);
tenArSetIncomingPacketRoutine(doIncomingPacket);
tenArSetPlayerEnteredRoutine(doPlayerEntered);
verifyNoErr(tenArInitArena("redalt"));
return (1);
} // end of Init
/***************************************************************************
* TenConnManClass::Service -- Service routine *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* 1. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Service(void)
{
tenArIdleArena();
return (1);
} // Service
/***************************************************************************
* TenConnManClass::Send_Private_Message -- Sends a "private" message *
* *
* If Connection ID is -1, the packet is multicast; otherwise, it's sent *
* to only the specified connection. *
* *
* Private & Global messages are sent via the same mechanism. The only *
* way to tell the difference between them is that the Global Channel *
* packets have the 'kGlobalChannelFlag' bit set in the 1st byte (the *
* "Type" field for EventClass's, and the NetCommand field for Global *
* packets). *
* *
* INPUT: *
* buf packet to send *
* buflen size of packet *
* reliable 1 = must be delivered reliably *
* conn_id connection ID to send to, -1 = all *
* *
* OUTPUT: *
* 1 = OK, 0 = error *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Send_Private_Message(void *buf, int buflen,
int reliable, int conn_id)
{
int doBroadcast = conn_id == -1;
unsigned char *ucbuf = (unsigned char *)buf;
//
// Ensure the global channel flag isn't set on this outgoing packet
//
(void)verify(!(ucbuf[0] & kGlobalChannelFlag));
if (doBroadcast)
{
if (reliable)
{
verifyNoErr(tenArSendToOtherPlayers(buf, buflen));
}
else
{
verifyNoErr(tenArUnreliableSendToOtherPlayers(buf, buflen));
}
}
else
{
int pid = Connection_Address(conn_id);
(void)verify(pid >= 0 && pid < kMaxPlayers);
if (reliable)
{
verifyNoErr(tenArSendToPlayer(pid, buf, buflen));
}
else
{
verifyNoErr(tenArUnreliableSendToPlayer(pid, buf, buflen));
}
}
return (1);
} // end of Send_Private_Message
/***************************************************************************
* TenConnManClass::Get_Private_Message -- Gets the next private message *
* *
* Retrieves the next-available "private" message, if there is one. *
* *
* INPUT: *
* buf packet retrieved *
* buflen length of packet *
* conn_id ptr to store sender's connection ID *
* *
* OUTPUT: *
* 1 = OK, 0 = error *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Get_Private_Message(void *buf, int *buflen,
int *conn_id)
{
int addr;
int addrlen;
int i;
if (PrivateQueue->Num_Receive() > 0) {
PrivateQueue->UnQueue_Receive(buf, buflen, 0, &addr, &addrlen);
(void)verify(addrlen == 4);
(*conn_id) = CONNECTION_NONE;
for (i = 0; i < NumConnections; i++) {
if (addr == Connections[i]) {
(*conn_id) = ID[i];
return (1);
}
}
}
return (0);
} // end of Get_Private_Message
/***************************************************************************
* TenConnManClass::Send_Global_Message -- Sends a "global" message *
* *
* INPUT: *
* buf packet to send *
* buflen length of packet *
* reliable 1 = send reliably *
* address address to send to; -1 = broadcast it (for TEN, this *
* means send to all connected players). *
* *
* OUTPUT: *
* 1 = OK, 0 = error *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Send_Global_Message(void *buf, int buflen,
int reliable, int address)
{
int doBroadcast = address == -1;
unsigned char *ucbuf = (unsigned char *)buf;
//
// Ensure the global channel flag isn't set on this outgoing packet
//
(void)verify(!(ucbuf[0] & kGlobalChannelFlag));
//
// Set the global channel flag for this packet
//
ucbuf[0] |= kGlobalChannelFlag;
if (doBroadcast)
{
if (reliable)
{
verifyNoErr(tenArSendToOtherPlayers(buf, buflen));
}
else
{
verifyNoErr(tenArUnreliableSendToOtherPlayers(buf, buflen));
}
}
else
{
int pid = address;
(void)verify(pid >= 0 && pid < kMaxPlayers);
if (reliable)
{
verifyNoErr(tenArSendToPlayer(pid, buf, buflen));
}
else
{
verifyNoErr(tenArUnreliableSendToPlayer(pid, buf, buflen));
}
}
//
// The caller may re-use this buffer, so clear the global channel flag.
//
ucbuf[0] &= ~kGlobalChannelFlag;
return (1);
} // end of Send_Global_Message
/***************************************************************************
* TenConnManClass::Get_Global_Message -- Gets next global message *
* *
* INPUT: *
* buf buffer to store packet in *
* buflen ptr filled in with packet length *
* address ptr filled in with address (Player ID) of sender *
* *
* OUTPUT: *
* 1 = OK, 0 = error *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Get_Global_Message(void *buf, int *buflen,
int *address)
{
int addrlen;
if (GlobalQueue->Num_Receive() > 0) {
GlobalQueue->UnQueue_Receive(buf, buflen, 0, address, &addrlen);
(void)verify(addrlen == 4);
return (1);
}
return (0);
} // end of Get_Global_Message
/***************************************************************************
* TenConnManClass::Num_Connections -- Reports # connections *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* # connections *
* *
* WARNINGS: *
* *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Num_Connections(void)
{
return (NumConnections);
} // end of Num_Connections
/***************************************************************************
* TenConnManClass::Connection_ID -- Reports a connection's ID *
* *
* INPUT: *
* index index of connection to report *
* *
* OUTPUT: *
* connection ID for this connection *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Connection_ID(int index)
{
if (index >= 0 && index < NumConnections) {
return(ID[index]);
} else {
return(CONNECTION_NONE);
}
} // end of Connection_ID
/***************************************************************************
* TenConnManClass::Connection_Index -- Gets a connection's index *
* *
* INPUT: *
* id Connection ID to find index for *
* *
* OUTPUT: *
* index for that connection *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Connection_Index(int id)
{
int i;
for (i = 0; i < NumConnections; i++) {
if (ID[i] == id) {
return (i);
}
}
return(CONNECTION_NONE);
} // end of Connection_Index
/***************************************************************************
* TenConnManClass::Create_Connection -- Creates a new connection *
* *
* INPUT: *
* id ID of connection *
* name name of connection *
* address TEN address (player ID) to give this connection *
* *
* OUTPUT: *
* 1 = OK, 0 = error
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Create_Connection(int id, char *name, int address)
{
Connections[NumConnections] = address;
ID[NumConnections] = id;
strcpy(Names[NumConnections], name);
NumConnections++;
return (1);
} // end of Create_Connection
/***************************************************************************
* TenConnManClass::Delete_Connection -- Deletes a connection *
* *
* INPUT: *
* id ID for connection to delete *
* *
* OUTPUT: *
* 1 = OK, 0 = error
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Delete_Connection(int id)
{
int i;
int idx = Connection_Index(id);
if (idx == CONNECTION_NONE) {
return 0;
}
for (i = idx; i < NumConnections - 1; i++) {
Connections[i] = Connections[i+1];
ID[i] = ID[i + 1];
strcpy (Names[i], Names[i + 1]);
}
NumConnections--;
return (1);
} // end of Delete_Connection
/***************************************************************************
* TenConnManClass::Connection_Name -- Reports a connection's name *
* *
* INPUT: *
* id ID of connection to report *
* *
* OUTPUT: *
* connection name *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
char * TenConnManClass::Connection_Name(int id)
{
int i;
for (i = 0; i < NumConnections; i++) {
if (ID[i]==id) {
return(Names[i]);
}
}
return(NULL);
} // end of Connection_Name
/***************************************************************************
* TenConnManClass::Connection_Address -- Gets a connection's "address" *
* *
* INPUT: *
* id ID of connection to report *
* *
* OUTPUT: *
* connection "address" (TEN player ID) *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Connection_Address(int id)
{
int i;
for (i = 0; i < NumConnections; i++) {
if (ID[i]==id) {
return(Connections[i]);
}
}
return(NULL);
} // end of Connection_Address
/***************************************************************************
* TenConnManClass::Global_Num_Send -- Reports # outgoing packets *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* 0. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Global_Num_Send(void)
{
return(0);
} // end of Global_Num_Send
/***************************************************************************
* TenConnManClass::Global_Num_Receive -- Reports # incoming packets *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* # packets waiting to be read *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Global_Num_Receive(void)
{
return (GlobalQueue->Num_Receive());
} // end of Global_Num_Receive
/***************************************************************************
* TenConnManClass::Private_Num_Send -- Reports # outgoing packets *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* 0. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Private_Num_Send(int /*id*/)
{
return(0);
} // end of Private_Num_Send
/***************************************************************************
* TenConnManClass::Private_Num_Receive -- Reports # incoming packets *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* # packets waiting to be read *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
int TenConnManClass::Private_Num_Receive(int /*id*/)
{
return (PrivateQueue->Num_Receive());
} // end of Private_Num_Receive
/***************************************************************************
* TenConnManClass::Flush_All -- Flushes all packets *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
void TenConnManClass::Flush_All(void)
{
int i;
int maxqueuesize;
int rc;
//
// Set the max # of packets that Ten will send me during any given
// call to tenArIdleArena() to slightly smaller than my max queue
// size.
//
maxqueuesize = 45;
rc = tenArSetOption(kTenArOptReadQueueSize, &maxqueuesize,
sizeof(maxqueuesize));
verifyNoErr(rc);
//
// Set the flag to tell the doIncomingPacket routine to ignore packets.
// (doIncomingPacket() is called by tenArIdleArena().)
//
IgnoreIncoming = 1;
while (i++ < 1000) {
tenArIdleArena();
if (GlobalQueue->Num_Receive() == 0 &&
PrivateQueue->Num_Receive() == 0) {
break;
}
GlobalQueue->Init();
PrivateQueue->Init();
}
IgnoreIncoming = 0;
} // end of Flush_All
/***************************************************************************
* TenConnManClass::Reset_Response_Time -- Does nothing *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
void TenConnManClass::Reset_Response_Time(void)
{
//
// (This function intentionally left blank.)
//
} // end of Reset_Response_Time
/***************************************************************************
* TenConnManClass::Response_Time -- Reports response time *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* worst-case connection response time (round-trip) *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
unsigned long TenConnManClass::Response_Time(void)
{
return((Session.NetResponseTime * 60) / 1000); // 300 milliseconds one way
} // end of Response_Time
/***************************************************************************
* TenConnManClass::Set_Timing -- Does nothing *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
void TenConnManClass::Set_Timing(unsigned long /*retrydelta*/,
unsigned long /*maxretries*/, unsigned long /*timeout*/)
{
//
// (This function intentionally left blank.)
//
} // end of Set_Timing
/***************************************************************************
* TenConnManClass::Configure_Debug -- Does nothing *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
void TenConnManClass::Configure_Debug(int /*index*/, int /*type_offset*/,
int /*type_size*/, char **/*names*/, int /*namestart*/, int /*namecount*/)
{
//
// (This function intentionally left blank.)
//
} // end of Configure_Debug
/***************************************************************************
* TenConnManClass::Mono_Debug_Print -- Does nothing *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
void TenConnManClass::Mono_Debug_Print(int /*index*/, int /*refresh*/)
{
//
// (This function intentionally left blank.)
//
} // end of Mono_Debug_Print
/***************************************************************************
* terminateApp -- Callback: app terminates on error *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
static void terminateApp(void)
{
Prog_End();
dprintf("Exiting due to a fatal error.\n");
exit(0);
} // end of terminateApp
/***************************************************************************
* debugMessage -- outputs debug message *
* *
* INPUT: *
* msgLevel not used *
* msg message to print *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
static void debugMessage(int /*msgLevel*/, char *msg)
{
static int recurse = 0;
if (recurse) {
return;
}
recurse = 1;
if (MonoClass::Is_Enabled()) {
Mono_Printf("%s\n",msg);
} else {
//printf("%s\n",msg);
FILE *fp;
fp = fopen("tendebug.log","at");
if (fp) {
fprintf(fp,"%s\n",msg);
fclose(fp);
}
}
if (GameActive) {
WWMessageBox().Process(msg);
}
recurse = 0;
} // end of debugMessage
/***************************************************************************
* doAlert -- Outputs debug message *
* *
* INPUT: *
* msg message to print *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
static void doAlert(int, int, char * msg)
{
static int recurse = 0;
if (recurse) {
return;
}
recurse = 1;
if (MonoClass::Is_Enabled()) {
Mono_Printf("%s\n",msg);
} else {
//printf("%s\n",msg);
FILE *fp;
fp = fopen("tenalert.log","at");
if (fp) {
fprintf(fp,"%s\n",msg);
fclose(fp);
}
}
if (GameActive) {
WWMessageBox().Process(msg);
}
recurse = 0;
} // end of doAlert
/***************************************************************************
* doPregameHook -- Callback: game is starting *
* *
* INPUT: *
* joinType if "create", we're the game host *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
static void doPregameHook(char * joinType, char *, char *,
char *, char *, char *)
{
char typeToken[16];
sscanf(joinType, "%s", typeToken);
if (!strcmp(typeToken, "create")) {
Ten->IsHost = 1;
}
if (Ten->IsHost) {
verifyNoErr(tenArReturnGameOptions(""));
}
verifyNoErr(tenArReturnPlayerOptions(""));
} // end of doPregameHook
/***************************************************************************
* doIncomingPacket -- Callback: packet has arrived *
* *
* INPUT: *
* addr player ID of sender *
* buf buffer containing incoming packet *
* size size of incoming packet *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
void doIncomingPacket(int addr, void *buf, size_t size)
{
int rc;
unsigned char *byte;
//
// Check to see if this packet belongs to the Global Channel or not
//
byte = (unsigned char *)buf;
//
// If the global channel flag is set in this packet, queue it onto the
// Global Channel queue. Ignore any errors if "IgnoreIncoming" is set,
// which means we're in the process of flushing the queues.
//
if (byte[0] & kGlobalChannelFlag) {
byte[0] &= (~kGlobalChannelFlag);
rc = Ten->GlobalQueue->Queue_Receive(buf, size, &addr, 4);
if (!IgnoreIncoming) {
(void)verify(rc==1);
}
} else {
rc = Ten->PrivateQueue->Queue_Receive(buf, size, &addr, 4);
if (!IgnoreIncoming) {
(void)verify(rc==1);
}
}
} // end of doIncomingPacket
/***************************************************************************
* doPlayerJoins -- Callback: player joins *
* *
* INPUT: *
* pid player ID of the player joining *
* isYou true = this is you *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 07/22/1996 BRR : Created. *
*=========================================================================*/
void doPlayerEntered(int pid, int isYou, char * /*options*/,
char */*termOptions*/, char */*address*/, long /*uniqueId*/,
char */*joinType*/)
{
if (isYou) {
Session.TenPlayerID = pid;
}
} // end of doPlayerJoins
#endif //TEN
/************************** end of tenmgr.cpp ******************************/