From c19a15471bb08a65703edf2e881b2cca15810731 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 4 Nov 2020 11:02:27 +0100 Subject: [PATCH] Reorder multi.cpp --- Source/multi.cpp | 544 +++++++++++++++++++++++------------------------ Source/multi.h | 30 --- 2 files changed, 272 insertions(+), 302 deletions(-) diff --git a/Source/multi.cpp b/Source/multi.cpp index f78ff3b40..9aa5a81e2 100644 --- a/Source/multi.cpp +++ b/Source/multi.cpp @@ -83,22 +83,19 @@ void __cdecl dumphist(const char *pszFmt, ...) } #endif -void multi_msg_add(BYTE *pbMsg, BYTE bLen) +static void buffer_init(TBuffer *pBuf) { - if (pbMsg && bLen) { - tmsg_add(pbMsg, bLen); - } + pBuf->dwNextWriteOffset = 0; + 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) { - multi_copy_packet(&sgLoPriBuf, pbMsg, bLen); - multi_send_packet(pbMsg, bLen); - } + return pBuf->dwNextWriteOffset == 0; } -void multi_copy_packet(TBuffer *buf, void *packet, BYTE size) +static void multi_copy_packet(TBuffer *buf, void *packet, BYTE size) { BYTE *p; @@ -114,18 +111,33 @@ void multi_copy_packet(TBuffer *buf, void *packet, BYTE size) 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); - pkt.hdr.wLen = dwSize + sizeof(pkt.hdr); - memcpy(pkt.body, packet, dwSize); - if (!SNetSendMessage(myplr, &pkt.hdr, pkt.hdr.wLen)) - nthread_terminate_game("SNetSendMessage0"); + 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 NetRecvPlrData(TPkt *pkt) +static void NetRecvPlrData(TPkt *pkt) { pkt->hdr.wCheck = 'ip'; pkt->hdr.px = plr[myplr]._px; @@ -139,6 +151,32 @@ void NetRecvPlrData(TPkt *pkt) 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) { 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) { 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; + DWORD l; - for (i = 0; i < MAX_PLRS; i++) { - if (player_state[i] & PS_TURN_ARRIVED) { - if (gdwMsgLenTbl[i] == 4) - multi_parse_turn(i, *(DWORD *)glpMsgTbl[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; - } + sgdwGameLoops++; + l = _rotr(sgdwGameLoops, 8); + for (i = 0; i < MAXMONSTERS; i++) + monster[i]._mAISeed = l + i; } -void multi_handle_turn_upper_bit(int pnum) +static void multi_handle_turn_upper_bit(int pnum) { 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; - sgdwPlayerLeftReasonTbl[pnum] = reason; - multi_clear_left_tbl(); + 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_clear_left_tbl() +void multi_msg_countdown() { int i; for (i = 0; i < MAX_PLRS; i++) { - if (sgbPlayerLeftGameTbl[i]) { - if (gbBufferMsgs == 1) - msg_send_drop_pkt(i, sgdwPlayerLeftReasonTbl[i]); - else - multi_player_left_msg(i, 1); - - sgbPlayerLeftGameTbl[i] = FALSE; - sgdwPlayerLeftReasonTbl[i] = 0; + if (player_state[i] & PS_TURN_ARRIVED) { + if (gdwMsgLenTbl[i] == 4) + multi_parse_turn(i, *(DWORD *)glpMsgTbl[i]); } } } -void multi_player_left_msg(int pnum, int left) +static void multi_player_left_msg(int pnum, int left) { const char *pszFmt; @@ -306,69 +305,48 @@ void multi_player_left_msg(int pnum, int left) } } -void multi_net_ping() -{ - sgbTimeout = TRUE; - sglTimeoutStart = GetTickCount(); -} - -int multi_handle_delta() +static void multi_clear_left_tbl() { int i; - BOOL received; - - if (gbGameDestroyed) { - gbRunGame = FALSE; - return FALSE; - } for (i = 0; i < MAX_PLRS; i++) { - if (sgbSendDeltaTbl[i]) { - sgbSendDeltaTbl[i] = FALSE; - DeltaExportData(i); - } - } - - sgbSentThisCycle = nthread_send_and_recv_turn(sgbSentThisCycle, 1); - if (!nthread_recv_turns(&received)) { - multi_begin_timeout(); - return FALSE; - } + if (sgbPlayerLeftGameTbl[i]) { + if (gbBufferMsgs == 1) + msg_send_drop_pkt(i, sgdwPlayerLeftReasonTbl[i]); + else + multi_player_left_msg(i, 1); - sgbTimeout = FALSE; - if (received) { - if (!gbShouldValidatePackage) { - NetSendHiPri(0, 0); - gbShouldValidatePackage = FALSE; - } else { - gbShouldValidatePackage = FALSE; - if (!multi_check_pkt_valid(&sgHiPriBuf)) - NetSendHiPri(0, 0); + sgbPlayerLeftGameTbl[i] = FALSE; + sgdwPlayerLeftReasonTbl[i] = 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 -int multi_check_pkt_valid(TBuffer *pBuf) +void multi_net_ping() { - return pBuf->dwNextWriteOffset == 0; + sgbTimeout = TRUE; + sglTimeoutStart = GetTickCount(); } -void multi_mon_seeds() +static void multi_check_drop_player() { int i; - DWORD l; - sgdwGameLoops++; - l = _rotr(sgdwGameLoops, 8); - for (i = 0; i < MAXMONSTERS; i++) - monster[i]._mAISeed = l + i; + for (i = 0; i < MAX_PLRS; i++) { + if (!(player_state[i] & PS_ACTIVE) && player_state[i] & PS_CONNECTED) { + SNetDropPlayer(i, LEAVE_DROP); + } + } } -void multi_begin_timeout() +static void multi_begin_timeout() { int i, nTicks, nState, nLowestActive, nLowestPlayer; BYTE bGroupPlayers, bGroupCount; @@ -439,15 +417,67 @@ void multi_begin_timeout() } } -void multi_check_drop_player() +int multi_handle_delta() { int i; + BOOL received; + + if (gbGameDestroyed) { + gbRunGame = FALSE; + return FALSE; + } for (i = 0; i < MAX_PLRS; i++) { - if (!(player_state[i] & PS_ACTIVE) && player_state[i] & PS_CONNECTED) { - SNetDropPlayer(i, LEAVE_DROP); + if (sgbSendDeltaTbl[i]) { + 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() @@ -521,30 +551,6 @@ void multi_process_network_packets() 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) { 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) { - return; - } + PkPlayerStruct pkplr; - sgbNetInited = FALSE; - nthread_cleanup(); - dthread_cleanup(); - tmsg_cleanup(); - multi_event_handler(FALSE); - SNetLeaveGame(3); -#ifndef HELLFIRE - msgcmd_cmd_cleanup(); + PackPlayer(&pkplr, myplr, TRUE); + dthread_send_delta(pnum, cmd, &pkplr, sizeof(pkplr)); +} + +static 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 - if (gbMaxPlayers > 1) - Sleep(2000); } -void multi_event_handler(BOOL add) +static void SetupLocalCoords() { - DWORD i; - BOOL(STORMAPI * fn) - (int, SEVTHANDLER); + int x, y; - if (add) - fn = SNetRegisterEventHandler; - else - fn = SNetUnregisterEventHandler; + 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; +} - for (i = 0; i < 3; i++) { - if (!fn(event_types[i], multi_handle_events) && add) { - app_fatal("SNetRegisterEventHandler:\n%s", TraceLastError()); +static 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 __stdcall multi_handle_events(_SNETEVENT *pEvt) +static void __stdcall multi_handle_events(_SNETEVENT *pEvt) { DWORD LeftReason; _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) { int i; @@ -787,77 +880,6 @@ BOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram) 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) { 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) { const char *szEvent; diff --git a/Source/multi.h b/Source/multi.h index 15a765d2f..7895619f3 100644 --- a/Source/multi.h +++ b/Source/multi.h @@ -9,8 +9,6 @@ extern BOOLEAN gbSomebodyWonGameKludge; extern char szPlayerDescript[128]; extern WORD sgwPackPlrOffsetTbl[MAX_PLRS]; -extern PkPlayerStruct netplr[MAX_PLRS]; -extern BOOL gbShouldValidatePackage; extern BYTE gbActivePlayers; extern BOOLEAN gbGameDestroyed; extern BOOLEAN gbSelectProvider; @@ -19,48 +17,20 @@ extern char szPlayerName[128]; extern BYTE gbDeltaSender; extern int player_state[MAX_PLRS]; -#ifdef _DEBUG -void __cdecl dumphist(const char *pszFmt, ...); -#endif void multi_msg_add(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); -BYTE *multi_recv_packet(TBuffer *pBuf, BYTE *body, int *size); void multi_send_msg_packet(int pmask, BYTE *src, BYTE len); 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_clear_left_tbl(); -void multi_player_left_msg(int pnum, int left); void multi_net_ping(); 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_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 NetClose(); -void multi_event_handler(BOOL add); -void __stdcall multi_handle_events(_SNETEVENT *pEvt); 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_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); -/* rdata */ - -extern const int event_types[3]; - #endif /* __MULTI_H__ */