Browse Source

Reorder multi.cpp

pull/914/head
Anders Jenbo 5 years ago
parent
commit
c19a15471b
  1. 544
      Source/multi.cpp
  2. 30
      Source/multi.h

544
Source/multi.cpp

@ -83,22 +83,19 @@ void __cdecl dumphist(const char *pszFmt, ...)
} }
#endif #endif
void multi_msg_add(BYTE *pbMsg, BYTE bLen) static void buffer_init(TBuffer *pBuf)
{ {
if (pbMsg && bLen) { pBuf->dwNextWriteOffset = 0;
tmsg_add(pbMsg, bLen); pBuf->bData[0] = 0;
}
} }
void NetSendLoPri(BYTE *pbMsg, BYTE bLen) // Microsoft VisualC 2-11/net runtime
static int multi_check_pkt_valid(TBuffer *pBuf)
{ {
if (pbMsg && bLen) { return pBuf->dwNextWriteOffset == 0;
multi_copy_packet(&sgLoPriBuf, pbMsg, bLen);
multi_send_packet(pbMsg, bLen);
}
} }
void multi_copy_packet(TBuffer *buf, void *packet, BYTE size) static void multi_copy_packet(TBuffer *buf, void *packet, BYTE size)
{ {
BYTE *p; BYTE *p;
@ -114,18 +111,33 @@ void multi_copy_packet(TBuffer *buf, void *packet, BYTE size)
p[size] = 0; p[size] = 0;
} }
void multi_send_packet(void *packet, BYTE dwSize) static BYTE *multi_recv_packet(TBuffer *pBuf, BYTE *body, int *size)
{ {
TPkt pkt; BYTE *src_ptr;
size_t chunk_size;
NetRecvPlrData(&pkt); if (pBuf->dwNextWriteOffset != 0) {
pkt.hdr.wLen = dwSize + sizeof(pkt.hdr); src_ptr = pBuf->bData;
memcpy(pkt.body, packet, dwSize); while (TRUE) {
if (!SNetSendMessage(myplr, &pkt.hdr, pkt.hdr.wLen)) if (*src_ptr == 0)
nthread_terminate_game("SNetSendMessage0"); break;
chunk_size = *src_ptr;
if (chunk_size > *size)
break;
src_ptr++;
memcpy(body, src_ptr, chunk_size);
body += chunk_size;
src_ptr += chunk_size;
*size -= chunk_size;
}
memcpy(pBuf->bData, src_ptr, (pBuf->bData - src_ptr) + pBuf->dwNextWriteOffset + 1);
pBuf->dwNextWriteOffset += (pBuf->bData - src_ptr);
return body;
}
return body;
} }
void NetRecvPlrData(TPkt *pkt) static void NetRecvPlrData(TPkt *pkt)
{ {
pkt->hdr.wCheck = 'ip'; pkt->hdr.wCheck = 'ip';
pkt->hdr.px = plr[myplr]._px; pkt->hdr.px = plr[myplr]._px;
@ -139,6 +151,32 @@ void NetRecvPlrData(TPkt *pkt)
pkt->hdr.bdex = plr[myplr]._pBaseDex; pkt->hdr.bdex = plr[myplr]._pBaseDex;
} }
void multi_msg_add(BYTE *pbMsg, BYTE bLen)
{
if (pbMsg && bLen) {
tmsg_add(pbMsg, bLen);
}
}
static void multi_send_packet(void *packet, BYTE dwSize)
{
TPkt pkt;
NetRecvPlrData(&pkt);
pkt.hdr.wLen = dwSize + sizeof(pkt.hdr);
memcpy(pkt.body, packet, dwSize);
if (!SNetSendMessage(myplr, &pkt.hdr, pkt.hdr.wLen))
nthread_terminate_game("SNetSendMessage0");
}
void NetSendLoPri(BYTE *pbMsg, BYTE bLen)
{
if (pbMsg && bLen) {
multi_copy_packet(&sgLoPriBuf, pbMsg, bLen);
multi_send_packet(pbMsg, bLen);
}
}
void NetSendHiPri(BYTE *pbMsg, BYTE bLen) void NetSendHiPri(BYTE *pbMsg, BYTE bLen)
{ {
BYTE *hipri_body; BYTE *hipri_body;
@ -165,32 +203,6 @@ void NetSendHiPri(BYTE *pbMsg, BYTE bLen)
} }
} }
BYTE *multi_recv_packet(TBuffer *pBuf, BYTE *body, int *size)
{
BYTE *src_ptr;
size_t chunk_size;
if (pBuf->dwNextWriteOffset != 0) {
src_ptr = pBuf->bData;
while (TRUE) {
if (*src_ptr == 0)
break;
chunk_size = *src_ptr;
if (chunk_size > *size)
break;
src_ptr++;
memcpy(body, src_ptr, chunk_size);
body += chunk_size;
src_ptr += chunk_size;
*size -= chunk_size;
}
memcpy(pBuf->bData, src_ptr, (pBuf->bData - src_ptr) + pBuf->dwNextWriteOffset + 1);
pBuf->dwNextWriteOffset += (pBuf->bData - src_ptr);
return body;
}
return body;
}
void multi_send_msg_packet(int pmask, BYTE *src, BYTE len) void multi_send_msg_packet(int pmask, BYTE *src, BYTE len)
{ {
DWORD v, p, t; DWORD v, p, t;
@ -210,34 +222,18 @@ void multi_send_msg_packet(int pmask, BYTE *src, BYTE len)
} }
} }
void multi_msg_countdown() static void multi_mon_seeds()
{ {
int i; int i;
DWORD l;
for (i = 0; i < MAX_PLRS; i++) { sgdwGameLoops++;
if (player_state[i] & PS_TURN_ARRIVED) { l = _rotr(sgdwGameLoops, 8);
if (gdwMsgLenTbl[i] == 4) for (i = 0; i < MAXMONSTERS; i++)
multi_parse_turn(i, *(DWORD *)glpMsgTbl[i]); monster[i]._mAISeed = l + i;
}
}
}
void multi_parse_turn(int pnum, int turn)
{
DWORD absTurns;
if (turn >> 31)
multi_handle_turn_upper_bit(pnum);
absTurns = turn & 0x7FFFFFFF;
if (sgbSentThisCycle < gdwTurnsInTransit + absTurns) {
if (absTurns >= 0x7FFFFFFF)
absTurns &= 0xFFFF;
sgbSentThisCycle = absTurns + gdwTurnsInTransit;
sgdwGameLoops = 4 * absTurns * sgbNetUpdateRate;
}
} }
void multi_handle_turn_upper_bit(int pnum) static void multi_handle_turn_upper_bit(int pnum)
{ {
int i; int i;
@ -253,31 +249,34 @@ void multi_handle_turn_upper_bit(int pnum)
} }
} }
void multi_player_left(int pnum, int reason) static void multi_parse_turn(int pnum, int turn)
{ {
sgbPlayerLeftGameTbl[pnum] = TRUE; DWORD absTurns;
sgdwPlayerLeftReasonTbl[pnum] = reason;
multi_clear_left_tbl(); if (turn >> 31)
multi_handle_turn_upper_bit(pnum);
absTurns = turn & 0x7FFFFFFF;
if (sgbSentThisCycle < gdwTurnsInTransit + absTurns) {
if (absTurns >= 0x7FFFFFFF)
absTurns &= 0xFFFF;
sgbSentThisCycle = absTurns + gdwTurnsInTransit;
sgdwGameLoops = 4 * absTurns * sgbNetUpdateRate;
}
} }
void multi_clear_left_tbl() void multi_msg_countdown()
{ {
int i; int i;
for (i = 0; i < MAX_PLRS; i++) { for (i = 0; i < MAX_PLRS; i++) {
if (sgbPlayerLeftGameTbl[i]) { if (player_state[i] & PS_TURN_ARRIVED) {
if (gbBufferMsgs == 1) if (gdwMsgLenTbl[i] == 4)
msg_send_drop_pkt(i, sgdwPlayerLeftReasonTbl[i]); multi_parse_turn(i, *(DWORD *)glpMsgTbl[i]);
else
multi_player_left_msg(i, 1);
sgbPlayerLeftGameTbl[i] = FALSE;
sgdwPlayerLeftReasonTbl[i] = 0;
} }
} }
} }
void multi_player_left_msg(int pnum, int left) static void multi_player_left_msg(int pnum, int left)
{ {
const char *pszFmt; const char *pszFmt;
@ -306,69 +305,48 @@ void multi_player_left_msg(int pnum, int left)
} }
} }
void multi_net_ping() static void multi_clear_left_tbl()
{
sgbTimeout = TRUE;
sglTimeoutStart = GetTickCount();
}
int multi_handle_delta()
{ {
int i; int i;
BOOL received;
if (gbGameDestroyed) {
gbRunGame = FALSE;
return FALSE;
}
for (i = 0; i < MAX_PLRS; i++) { for (i = 0; i < MAX_PLRS; i++) {
if (sgbSendDeltaTbl[i]) { if (sgbPlayerLeftGameTbl[i]) {
sgbSendDeltaTbl[i] = FALSE; if (gbBufferMsgs == 1)
DeltaExportData(i); msg_send_drop_pkt(i, sgdwPlayerLeftReasonTbl[i]);
} else
} multi_player_left_msg(i, 1);
sgbSentThisCycle = nthread_send_and_recv_turn(sgbSentThisCycle, 1);
if (!nthread_recv_turns(&received)) {
multi_begin_timeout();
return FALSE;
}
sgbTimeout = FALSE; sgbPlayerLeftGameTbl[i] = FALSE;
if (received) { sgdwPlayerLeftReasonTbl[i] = 0;
if (!gbShouldValidatePackage) {
NetSendHiPri(0, 0);
gbShouldValidatePackage = FALSE;
} else {
gbShouldValidatePackage = FALSE;
if (!multi_check_pkt_valid(&sgHiPriBuf))
NetSendHiPri(0, 0);
} }
} }
multi_mon_seeds(); }
return TRUE; void multi_player_left(int pnum, int reason)
{
sgbPlayerLeftGameTbl[pnum] = TRUE;
sgdwPlayerLeftReasonTbl[pnum] = reason;
multi_clear_left_tbl();
} }
// Microsoft VisualC 2-11/net runtime void multi_net_ping()
int multi_check_pkt_valid(TBuffer *pBuf)
{ {
return pBuf->dwNextWriteOffset == 0; sgbTimeout = TRUE;
sglTimeoutStart = GetTickCount();
} }
void multi_mon_seeds() static void multi_check_drop_player()
{ {
int i; int i;
DWORD l;
sgdwGameLoops++; for (i = 0; i < MAX_PLRS; i++) {
l = _rotr(sgdwGameLoops, 8); if (!(player_state[i] & PS_ACTIVE) && player_state[i] & PS_CONNECTED) {
for (i = 0; i < MAXMONSTERS; i++) SNetDropPlayer(i, LEAVE_DROP);
monster[i]._mAISeed = l + i; }
}
} }
void multi_begin_timeout() static void multi_begin_timeout()
{ {
int i, nTicks, nState, nLowestActive, nLowestPlayer; int i, nTicks, nState, nLowestActive, nLowestPlayer;
BYTE bGroupPlayers, bGroupCount; BYTE bGroupPlayers, bGroupCount;
@ -439,15 +417,67 @@ void multi_begin_timeout()
} }
} }
void multi_check_drop_player() int multi_handle_delta()
{ {
int i; int i;
BOOL received;
if (gbGameDestroyed) {
gbRunGame = FALSE;
return FALSE;
}
for (i = 0; i < MAX_PLRS; i++) { for (i = 0; i < MAX_PLRS; i++) {
if (!(player_state[i] & PS_ACTIVE) && player_state[i] & PS_CONNECTED) { if (sgbSendDeltaTbl[i]) {
SNetDropPlayer(i, LEAVE_DROP); sgbSendDeltaTbl[i] = FALSE;
DeltaExportData(i);
}
}
sgbSentThisCycle = nthread_send_and_recv_turn(sgbSentThisCycle, 1);
if (!nthread_recv_turns(&received)) {
multi_begin_timeout();
return FALSE;
}
sgbTimeout = FALSE;
if (received) {
if (!gbShouldValidatePackage) {
NetSendHiPri(0, 0);
gbShouldValidatePackage = FALSE;
} else {
gbShouldValidatePackage = FALSE;
if (!multi_check_pkt_valid(&sgHiPriBuf))
NetSendHiPri(0, 0);
} }
} }
multi_mon_seeds();
return TRUE;
}
static void multi_handle_all_packets(int pnum, BYTE *pData, int nSize)
{
int nLen;
while (nSize != 0) {
nLen = ParseCmd(pnum, (TCmd *)pData);
if (nLen == 0) {
break;
}
pData += nLen;
nSize -= nLen;
}
}
static void multi_process_tmsgs()
{
int cnt;
TPkt pkt;
while (cnt = tmsg_get((BYTE *)&pkt, 512)) {
multi_handle_all_packets(myplr, (BYTE *)&pkt, cnt);
}
} }
void multi_process_network_packets() void multi_process_network_packets()
@ -521,30 +551,6 @@ void multi_process_network_packets()
nthread_terminate_game("SNetReceiveMsg"); nthread_terminate_game("SNetReceiveMsg");
} }
void multi_handle_all_packets(int pnum, BYTE *pData, int nSize)
{
int nLen;
while (nSize != 0) {
nLen = ParseCmd(pnum, (TCmd *)pData);
if (nLen == 0) {
break;
}
pData += nLen;
nSize -= nLen;
}
}
void multi_process_tmsgs()
{
int cnt;
TPkt pkt;
while (cnt = tmsg_get((BYTE *)&pkt, 512)) {
multi_handle_all_packets(myplr, (BYTE *)&pkt, cnt);
}
}
void multi_send_zero_packet(int pnum, BYTE bCmd, BYTE *pbSrc, DWORD dwLen) void multi_send_zero_packet(int pnum, BYTE bCmd, BYTE *pbSrc, DWORD dwLen)
{ {
DWORD dwOffset, dwBody, dwMsg; DWORD dwOffset, dwBody, dwMsg;
@ -610,44 +616,94 @@ void multi_send_zero_packet(int pnum, BYTE bCmd, BYTE *pbSrc, DWORD dwLen)
} }
} }
void NetClose() static void multi_send_pinfo(int pnum, char cmd)
{ {
if (!sgbNetInited) { PkPlayerStruct pkplr;
return;
}
sgbNetInited = FALSE; PackPlayer(&pkplr, myplr, TRUE);
nthread_cleanup(); dthread_send_delta(pnum, cmd, &pkplr, sizeof(pkplr));
dthread_cleanup(); }
tmsg_cleanup();
multi_event_handler(FALSE); static int InitLevelType(int l)
SNetLeaveGame(3); {
#ifndef HELLFIRE if (l == 0)
msgcmd_cmd_cleanup(); return DTYPE_TOWN;
if (l >= 1 && l <= 4)
return DTYPE_CATHEDRAL;
if (l >= 5 && l <= 8)
return DTYPE_CATACOMBS;
if (l >= 9 && l <= 12)
return DTYPE_CAVES;
#ifdef HELLFIRE
if (l >= 13 && l <= 16)
return DTYPE_HELL;
if (l >= 21 && l <= 24)
return DTYPE_CATHEDRAL; // Crypt
if (l >= 17 && l <= 20)
return DTYPE_CAVES; // Hive
return DTYPE_CATHEDRAL;
#else
return DTYPE_HELL;
#endif #endif
if (gbMaxPlayers > 1)
Sleep(2000);
} }
void multi_event_handler(BOOL add) static void SetupLocalCoords()
{ {
DWORD i; int x, y;
BOOL(STORMAPI * fn)
(int, SEVTHANDLER);
if (add) if (!leveldebug || gbMaxPlayers > 1) {
fn = SNetRegisterEventHandler; currlevel = 0;
else leveltype = DTYPE_TOWN;
fn = SNetUnregisterEventHandler; setlevel = FALSE;
}
x = 75;
y = 68;
#ifdef _DEBUG
if (debug_mode_key_inverted_v || debug_mode_key_d) {
x = 49;
y = 23;
}
#endif
x += plrxoff[myplr];
y += plryoff[myplr];
plr[myplr]._px = x;
plr[myplr]._py = y;
plr[myplr]._pfutx = x;
plr[myplr]._pfuty = y;
plr[myplr]._ptargx = x;
plr[myplr]._ptargy = y;
plr[myplr].plrlevel = currlevel;
plr[myplr]._pLvlChanging = TRUE;
plr[myplr].pLvlLoad = 0;
plr[myplr]._pmode = PM_NEWLVL;
plr[myplr].destAction = ACTION_NONE;
}
for (i = 0; i < 3; i++) { static BOOL multi_upgrade(BOOL *pfExitProgram)
if (!fn(event_types[i], multi_handle_events) && add) { {
app_fatal("SNetRegisterEventHandler:\n%s", TraceLastError()); BOOL result;
int status;
SNetPerformUpgrade((LPDWORD)&status);
result = TRUE;
if (status && status != 1) {
if (status != 2) {
if (status == -1) {
DrawDlg("Network upgrade failed");
}
} else {
*pfExitProgram = 1;
} }
result = FALSE;
} }
return result;
} }
void __stdcall multi_handle_events(_SNETEVENT *pEvt) static void __stdcall multi_handle_events(_SNETEVENT *pEvt)
{ {
DWORD LeftReason; DWORD LeftReason;
_gamedata *gameData; _gamedata *gameData;
@ -682,6 +738,43 @@ void __stdcall multi_handle_events(_SNETEVENT *pEvt)
} }
} }
static void multi_event_handler(BOOL add)
{
DWORD i;
BOOL(STORMAPI * fn)
(int, SEVTHANDLER);
if (add)
fn = SNetRegisterEventHandler;
else
fn = SNetUnregisterEventHandler;
for (i = 0; i < 3; i++) {
if (!fn(event_types[i], multi_handle_events) && add) {
app_fatal("SNetRegisterEventHandler:\n%s", TraceLastError());
}
}
}
void NetClose()
{
if (!sgbNetInited) {
return;
}
sgbNetInited = FALSE;
nthread_cleanup();
dthread_cleanup();
tmsg_cleanup();
multi_event_handler(FALSE);
SNetLeaveGame(3);
#ifndef HELLFIRE
msgcmd_cmd_cleanup();
#endif
if (gbMaxPlayers > 1)
Sleep(2000);
}
BOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram) BOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram)
{ {
int i; int i;
@ -787,77 +880,6 @@ BOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram)
return TRUE; return TRUE;
} }
void buffer_init(TBuffer *pBuf)
{
pBuf->dwNextWriteOffset = 0;
pBuf->bData[0] = 0;
}
void multi_send_pinfo(int pnum, char cmd)
{
PkPlayerStruct pkplr;
PackPlayer(&pkplr, myplr, TRUE);
dthread_send_delta(pnum, cmd, &pkplr, sizeof(pkplr));
}
int InitLevelType(int l)
{
if (l == 0)
return DTYPE_TOWN;
if (l >= 1 && l <= 4)
return DTYPE_CATHEDRAL;
if (l >= 5 && l <= 8)
return DTYPE_CATACOMBS;
if (l >= 9 && l <= 12)
return DTYPE_CAVES;
#ifdef HELLFIRE
if (l >= 13 && l <= 16)
return DTYPE_HELL;
if (l >= 21 && l <= 24)
return DTYPE_CATHEDRAL; // Crypt
if (l >= 17 && l <= 20)
return DTYPE_CAVES; // Hive
return DTYPE_CATHEDRAL;
#else
return DTYPE_HELL;
#endif
}
void SetupLocalCoords()
{
int x, y;
if (!leveldebug || gbMaxPlayers > 1) {
currlevel = 0;
leveltype = DTYPE_TOWN;
setlevel = FALSE;
}
x = 75;
y = 68;
#ifdef _DEBUG
if (debug_mode_key_inverted_v || debug_mode_key_d) {
x = 49;
y = 23;
}
#endif
x += plrxoff[myplr];
y += plryoff[myplr];
plr[myplr]._px = x;
plr[myplr]._py = y;
plr[myplr]._pfutx = x;
plr[myplr]._pfuty = y;
plr[myplr]._ptargx = x;
plr[myplr]._ptargy = y;
plr[myplr].plrlevel = currlevel;
plr[myplr]._pLvlChanging = TRUE;
plr[myplr].pLvlLoad = 0;
plr[myplr]._pmode = PM_NEWLVL;
plr[myplr].destAction = ACTION_NONE;
}
BOOL multi_init_single(_SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info) BOOL multi_init_single(_SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info)
{ {
int unused; int unused;
@ -921,28 +943,6 @@ BOOL multi_init_multi(_SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info,
} }
} }
BOOL multi_upgrade(BOOL *pfExitProgram)
{
BOOL result;
int status;
SNetPerformUpgrade((LPDWORD)&status);
result = TRUE;
if (status && status != 1) {
if (status != 2) {
if (status == -1) {
DrawDlg("Network upgrade failed");
}
} else {
*pfExitProgram = 1;
}
result = FALSE;
}
return result;
}
void recv_plrinfo(int pnum, TCmdPlrInfoHdr *p, BOOL recv) void recv_plrinfo(int pnum, TCmdPlrInfoHdr *p, BOOL recv)
{ {
const char *szEvent; const char *szEvent;

30
Source/multi.h

@ -9,8 +9,6 @@
extern BOOLEAN gbSomebodyWonGameKludge; extern BOOLEAN gbSomebodyWonGameKludge;
extern char szPlayerDescript[128]; extern char szPlayerDescript[128];
extern WORD sgwPackPlrOffsetTbl[MAX_PLRS]; extern WORD sgwPackPlrOffsetTbl[MAX_PLRS];
extern PkPlayerStruct netplr[MAX_PLRS];
extern BOOL gbShouldValidatePackage;
extern BYTE gbActivePlayers; extern BYTE gbActivePlayers;
extern BOOLEAN gbGameDestroyed; extern BOOLEAN gbGameDestroyed;
extern BOOLEAN gbSelectProvider; extern BOOLEAN gbSelectProvider;
@ -19,48 +17,20 @@ extern char szPlayerName[128];
extern BYTE gbDeltaSender; extern BYTE gbDeltaSender;
extern int player_state[MAX_PLRS]; extern int player_state[MAX_PLRS];
#ifdef _DEBUG
void __cdecl dumphist(const char *pszFmt, ...);
#endif
void multi_msg_add(BYTE *pbMsg, BYTE bLen); void multi_msg_add(BYTE *pbMsg, BYTE bLen);
void NetSendLoPri(BYTE *pbMsg, BYTE bLen); void NetSendLoPri(BYTE *pbMsg, BYTE bLen);
void multi_copy_packet(TBuffer *pBuf, void *packet, BYTE size);
void multi_send_packet(void *packet, BYTE dwSize);
void NetRecvPlrData(TPkt *pkt);
void NetSendHiPri(BYTE *pbMsg, BYTE bLen); void NetSendHiPri(BYTE *pbMsg, BYTE bLen);
BYTE *multi_recv_packet(TBuffer *pBuf, BYTE *body, int *size);
void multi_send_msg_packet(int pmask, BYTE *src, BYTE len); void multi_send_msg_packet(int pmask, BYTE *src, BYTE len);
void multi_msg_countdown(); void multi_msg_countdown();
void multi_parse_turn(int pnum, int turn);
void multi_handle_turn_upper_bit(int pnum);
void multi_player_left(int pnum, int reason); void multi_player_left(int pnum, int reason);
void multi_clear_left_tbl();
void multi_player_left_msg(int pnum, int left);
void multi_net_ping(); void multi_net_ping();
int multi_handle_delta(); int multi_handle_delta();
int multi_check_pkt_valid(TBuffer *pBuf);
void multi_mon_seeds();
void multi_begin_timeout();
void multi_check_drop_player();
void multi_process_network_packets(); void multi_process_network_packets();
void multi_handle_all_packets(int pnum, BYTE *pData, int nSize);
void multi_process_tmsgs();
void multi_send_zero_packet(int pnum, BYTE bCmd, BYTE *pbSrc, DWORD dwLen); void multi_send_zero_packet(int pnum, BYTE bCmd, BYTE *pbSrc, DWORD dwLen);
void NetClose(); void NetClose();
void multi_event_handler(BOOL add);
void __stdcall multi_handle_events(_SNETEVENT *pEvt);
BOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram); BOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram);
void buffer_init(TBuffer *pBuf);
void multi_send_pinfo(int pnum, char cmd);
int InitLevelType(int l);
void SetupLocalCoords();
BOOL multi_init_single(_SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info); BOOL multi_init_single(_SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info);
BOOL multi_init_multi(_SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info, BOOL *pfExitProgram); BOOL multi_init_multi(_SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info, BOOL *pfExitProgram);
BOOL multi_upgrade(BOOL *pfExitProgram);
void recv_plrinfo(int pnum, TCmdPlrInfoHdr *p, BOOL recv); void recv_plrinfo(int pnum, TCmdPlrInfoHdr *p, BOOL recv);
/* rdata */
extern const int event_types[3];
#endif /* __MULTI_H__ */ #endif /* __MULTI_H__ */

Loading…
Cancel
Save