Devilution
Diablo devolved - magic behind the 1996 computer game
|
Go to the documentation of this file.
7 #include "../3rdParty/Storm/Source/storm.h"
8 #include "../DiabloUI/diabloui.h"
78 memcpy(p, packet, size);
88 memcpy(pkt.
body, packet, dwSize);
128 if (!SNetSendMessage(-2, &pkt.
hdr, len))
139 src_ptr = pBuf->
bData;
143 chunk_size = *src_ptr;
144 if (chunk_size > *size)
147 memcpy(body, src_ptr, chunk_size);
149 src_ptr += chunk_size;
167 memcpy(pkt.
body, src, len);
168 for (v = 1, p = 0; p <
MAX_PLRS; p++, v <<= 1) {
170 if (!SNetSendMessage(p, &pkt.
hdr, t) && SErrGetLastError() != STORM_ERROR_INVALID_PLAYER) {
196 absTurns = turn & 0x7FFFFFFF;
198 if (absTurns >= 0x7FFFFFFF)
216 }
else if (
myplr == pnum) {
249 if (
plr[pnum].plractive) {
256 pszFmt =
"Player '%s' just left the game";
259 pszFmt =
"Player '%s' killed Diablo and left the game!";
263 pszFmt =
"Player '%s' dropped due to timeout";
338 int i, nTicks, nState, nLowestActive, nLowestPlayer;
339 BYTE bGroupPlayers, bGroupCount;
345 if (debug_mode_key_i) {
351 if (nTicks > 20000) {
355 if (nTicks < 10000) {
365 if (nState & 0x10000) {
366 if (nLowestPlayer == -1) {
369 if (nState & 0x40000) {
371 if (nLowestActive == -1) {
384 if (bGroupPlayers < bGroupCount) {
386 }
else if (bGroupPlayers == bGroupCount) {
387 if (nLowestPlayer != nLowestActive) {
389 }
else if (nLowestActive ==
myplr) {
392 }
else if (nLowestActive ==
myplr) {
403 SNetDropPlayer(i, 0x40000006);
419 while (SNetReceiveMessage((
int *)&dwID, &data, (
int *)&dwMsgSize)) {
423 if (dwMsgSize <
sizeof(
TPktHdr))
429 if (pkt->
wLen != dwMsgSize)
441 if (!cond &&
plr[dwID].plractive &&
plr[dwID]._pHitPoints) {
443 dx = abs(
plr[dwID].WorldX - pkt->
px);
444 dy = abs(
plr[dwID].WorldY - pkt->
py);
445 if ((dx > 3 || dy > 3) &&
dPlayer[pkt->
px][pkt->
py] == 0) {
456 dx = abs(
plr[dwID]._px -
plr[dwID].WorldX);
457 dy = abs(
plr[dwID]._py -
plr[dwID].WorldY);
458 if (dx > 1 || dy > 1) {
475 if (SErrGetLastError() != STORM_ERROR_NO_MESSAGES_WAITING)
498 while (cnt =
tmsg_get((BYTE *)&pkt, 512)) {
505 DWORD dwOffset, dwBody, dwMsg;
530 if (dwLen < dwBody) {
535 memcpy(&pkt.
body[
sizeof(*p)], pbSrc, p->
wBytes);
536 dwMsg =
sizeof(pkt.
hdr);
540 if (!SNetSendMessage(pnum, &pkt, dwMsg)) {
559 debug_plr_tbl[pnum]++;
591 fn = SNetRegisterEventHandler;
593 fn = SNetUnregisterEventHandler;
595 for (i = 0; i < 3; i++) {
609 data = (DWORD *)pEvt->
data;
618 data = (DWORD *)pEvt->
data;
620 LeftReason = data[0];
622 if (LeftReason == 0x40000004)
636 BOOL
NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram)
645 *pfExitProgram = FALSE;
649 memset(&ProgramData, 0,
sizeof(ProgramData));
650 ProgramData.
size =
sizeof(ProgramData);
663 ProgramData.
lcid = 1033;
664 memset(&plrdata, 0,
sizeof(plrdata));
665 plrdata.
size =
sizeof(plrdata);
666 memset(&UiData, 0,
sizeof(UiData));
667 UiData.
size =
sizeof(UiData);
686 memset(
plr, 0,
sizeof(
plr));
688 SNetSetBasePlayer(0);
724 for (i = 0; i < 17; i++) {
754 if (l >= 1 && l <= 4)
756 if (l >= 5 && l <= 8)
758 if (l >= 9 && l <= 12)
776 if (debug_mode_key_inverted_v || debug_mode_key_d) {
806 if (!SNetCreateGame(
"local",
"local",
"local", 0, (
char *)&
sgGameInitInfo.
dwSeed, 8, 1,
"local",
"local", &unused)) {
822 for (first = TRUE;; first = FALSE) {
825 if (!UiSelectProvider(0, client_info, user_info, ui_info, &
fileinfo, &type)
826 && (!first || SErrGetLastError() != STORM_ERROR_REQUIRES_UPGRADE || !
multi_upgrade(pfExitProgram))) {
834 if (UiSelectGame(1, client_info, user_info, ui_info, &
fileinfo, &playerId))
860 SNetPerformUpgrade((LPDWORD)&status);
862 if (status && status != 1) {
865 DrawDlg(
"Network upgrade failed");
915 szEvent =
"Player '%s' (level %d) just joined the game";
917 szEvent =
"Player '%s' (level %d) is already in the game";
925 if (
plr[pnum]._pHitPoints >> 6 > 0) {
void multi_parse_turn(int pnum, int turn)
void(* changenamecallback)()
void SetRndSeed(int s)
Set the RNG seed.
void pfile_read_player_from_save()
void(* profilebitmapcallback)()
WORD sgwPackPlrOffsetTbl[MAX_PLRS]
void FixPlrWalkTags(int pnum)
void MakePlrPath(int pnum, int xx, int yy, BOOL endspace)
uintptr_t glpMsgTbl[MAX_PLRS]
void multi_msg_countdown()
void multi_copy_packet(TBuffer *buf, void *packet, BYTE size)
BOOL multi_upgrade(BOOL *pfExitProgram)
DWORD nthread_send_and_recv_turn(DWORD cur_turn, int turn_delta)
char szPlayerDescript[128]
const int event_types[3]
Contains the set of supported event types supported by the multiplayer event handler.
void(* getdatacallback)()
DWORD gdwMsgLenTbl[MAX_PLRS]
void buffer_init(TBuffer *pBuf)
void multi_check_drop_player()
int tmsg_get(BYTE *pbMsg, DWORD dwMaxLen)
void multi_send_packet(void *packet, BYTE dwSize)
void dthread_send_delta(int pnum, char cmd, void *pbSrc, int dwLen)
void multi_handle_all_packets(int pnum, BYTE *pData, int nSize)
int gnLevelTypeTbl[NUMLEVELS]
BOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram)
BOOLEAN sgbPlayerTurnBitTbl[MAX_PLRS]
int multi_check_pkt_valid(TBuffer *pBuf)
void(* profilecallback)()
void nthread_start(BOOL set_turn_upper_bit)
void multi_handle_turn_upper_bit(int pnum)
PkPlayerStruct netplr[MAX_PLRS]
BYTE gbMaxPlayers
Specifies the maximum number of players in a game, where 1 represents a single player game and 4 repr...
void multi_msg_add(BYTE *pbMsg, BYTE bLen)
void recv_plrinfo(int pnum, TCmdPlrInfoHdr *p, BOOL recv)
void NewPlrAnim(int pnum, BYTE *Peq, int numFrames, int Delay, int width)
void RemovePlrFromMap(int pnum)
void multi_handle_events(_SNETEVENT *pEvt)
void(* categorycallback)()
void DeltaExportData(int pnum)
void multi_send_msg_packet(int pmask, BYTE *src, BYTE len)
char gszVersionNumber[MAX_PATH]
defined in dx.cpp
void DeactivatePortal(int i)
void SyncInitPlr(int pnum)
void multi_process_tmsgs()
DWORD sync_all_monsters(const BYTE *pbBuf, DWORD dwMaxLen)
void app_fatal(const char *pszFmt,...)
BOOL multi_init_multi(_SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info, BOOL *pfExitProgram)
int(* selectnamecallback)(const struct _SNETPROGRAMDATA *, const struct _SNETPLAYERDATA *, const struct _SNETUIDATA *, const struct _SNETVERSIONDATA *, DWORD provider, char *, DWORD, char *, DWORD, BOOL *)
#define DEVILUTION_END_NAMESPACE
@ EVENT_TYPE_PLAYER_MESSAGE
MonsterStruct monster[MAXMONSTERS]
void multi_player_left_msg(int pnum, int left)
void multi_clear_left_tbl()
DEVILUTION_BEGIN_NAMESPACE BYTE sgbNetUpdateRate
DEVILUTION_BEGIN_NAMESPACE BOOLEAN gbSomebodyWonGameKludge
void nthread_terminate_game(const char *pszFcn)
void delta_close_portal(int pnum)
BOOLEAN sgbSendDeltaTbl[MAX_PLRS]
char * ErrorPlrMsg(const char *pszMsg)
void StartStand(int pnum, int dir)
BYTE * multi_recv_packet(TBuffer *pBuf, BYTE *body, int *size)
int player_state[MAX_PLRS]
void dthread_remove_player(int pnum)
void UnPackPlayer(PkPlayerStruct *pPack, int pnum, BOOL killok)
void(* drawdesccallback)()
int GetRndSeed()
Get the current RNG seed.
char * programdescription
void NetSendHiPri(BYTE *pbMsg, BYTE bLen)
BOOL nthread_recv_turns(BOOL *pfSendAsync)
DWORD glSeedTbl[NUMLEVELS]
void RemovePlrMissiles(int pnum)
@ EVENT_TYPE_PLAYER_LEAVE_GAME
DEVILUTION_BEGIN_NAMESPACE _SNETVERSIONDATA fileinfo
BOOLEAN sgbPlayerLeftGameTbl[MAX_PLRS]
size_t EventPlrMsg(const char *pszFmt,...)
void multi_player_left(int pnum, int reason)
void NetSendLoPri(BYTE *pbMsg, BYTE bLen)
int sgdwPlayerLeftReasonTbl[MAX_PLRS]
void RemovePortalMissile(int id)
void mainmenu_change_name(int arg1, int arg2, int arg3, int arg4, char *name_1, char *name_2)
void multi_begin_timeout()
const char ** profilefields
void DrawDlg(char *pszFmt,...)
char dPlayer[MAXDUNX][MAXDUNY]
char dFlags[MAXDUNX][MAXDUNY]
int mainmenu_select_hero_dialog(const _SNETPROGRAMDATA *client_info, const _SNETPLAYERDATA *user_info, const _SNETUIDATA *ui_info, const _SNETVERSIONDATA *fileinfo, DWORD mode, char *cname, DWORD clen, char *cdesc, DWORD cdlen, BOOL *multi)
void(* messageboxcallback)()
void PackPlayer(PkPlayerStruct *pPack, int pnum, BOOL manashield)
DWORD ParseCmd(int pnum, TCmd *pCmd)
char _pName[PLR_NAME_LEN]
void multi_process_network_packets()
void NetRecvPlrData(TPkt *pkt)
void multi_event_handler(BOOL add)
BOOL multi_init_single(_SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info)
PlayerStruct plr[MAX_PLRS]
void multi_send_zero_packet(int pnum, BYTE bCmd, BYTE *pbSrc, DWORD dwLen)
void msg_send_drop_pkt(int pnum, int reason)
void tmsg_add(BYTE *pbMsg, BYTE bLen)
void LoadPlrGFX(int pnum, player_graphic gfxflag)
@ EVENT_TYPE_PLAYER_CREATE_GAME
BOOL gbShouldValidatePackage
void multi_send_pinfo(int pnum, char cmd)