Browse Source

Merge pull request #505 from AJenbo/msg.cpp2

Msg.cpp min diff
pull/25/head
Anders Jenbo 7 years ago committed by GitHub
parent
commit
9a71c4b646
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 384
      Source/msg.cpp

384
Source/msg.cpp

@ -13,7 +13,7 @@ static BYTE sgbRecvCmd;
static LocalLevel sgLocals[NUMLEVELS];
static DJunk sgJunk;
static TMegaPkt *sgpMegaPkt;
static BYTE sgbDeltaChanged;
static BOOLEAN sgbDeltaChanged;
static BYTE sgbDeltaChunks;
BOOL deltaload;
BYTE gbBufferMsgs;
@ -69,7 +69,7 @@ TMegaPkt *__cdecl msg_get_next_packet()
BOOL __cdecl msg_wait_resync()
{
int v0; // eax
BOOL success;
msg_get_next_packet();
sgbDeltaChunks = 0;
@ -77,21 +77,26 @@ BOOL __cdecl msg_wait_resync()
sgbRecvCmd = CMD_DLEVEL_END;
gbBufferMsgs = 1;
sgdwOwnerWait = GetTickCount();
v0 = UiProgressDialog(ghMainWnd, "Waiting for game data...", 1, msg_wait_for_turns, 20);
success = UiProgressDialog(ghMainWnd, "Waiting for game data...", 1, msg_wait_for_turns, 20);
gbBufferMsgs = 0;
if (!v0)
goto LABEL_6;
if (!success) {
msg_free_packets();
return FALSE;
}
if (gbGameDestroyed) {
DrawDlg("The game ended");
LABEL_6:
msg_free_packets();
return 0;
return FALSE;
}
if (sgbDeltaChunks != 21) {
DrawDlg("Unable to get level data");
goto LABEL_6;
msg_free_packets();
return FALSE;
}
return 1;
return TRUE;
}
// 65AB18: using guessed type int sgdwOwnerWait;
// 65AB24: using guessed type int sgnCurrMegaPlayer;
@ -196,42 +201,28 @@ void __cdecl msg_pre_packet()
void __fastcall DeltaExportData(int pnum)
{
BYTE *v1; // edi
DObjectStr *v2; // esi
BYTE *v3; // ebx
BYTE *v4; // eax
BYTE *v5; // eax
BYTE *v6; // eax
int v7; // eax
BYTE *v8; // eax
int v9; // eax
int player_num; // [esp+0h] [ebp-Ch]
int v11; // [esp+4h] [ebp-8h]
char src; // [esp+Bh] [ebp-1h]
player_num = pnum;
BYTE *dst, *dstEnd;
int size, i;
char src;
if (sgbDeltaChanged) {
v11 = 0;
v1 = (BYTE *)DiabloAllocPtr(4722);
v2 = sgLevels[0].object;
v3 = v1 + 1;
do {
v4 = DeltaExportItem(v3, (TCmdPItem *)&v2[-2794]);
v5 = DeltaExportObject(v4, v2);
v6 = DeltaExportMonster(v5, (DMonsterStr *)&v2[127]);
v7 = msg_comp_level(v1, v6);
dthread_send_delta(player_num, (_BYTE)v11++ + CMD_DLEVEL_0, v1, v7);
v2 += 4721;
} while ((signed int)v2 < (signed int)&sgLevels[NUMLEVELS].object);
v8 = DeltaExportJunk(v3);
v9 = msg_comp_level(v1, v8);
dthread_send_delta(player_num, CMD_DLEVEL_JUNK, v1, v9);
mem_free_dbg(v1);
dst = (BYTE *)DiabloAllocPtr(4722);
dstEnd = dst + 1;
for (i = 0; i < NUMLEVELS; i++) {
dstEnd = DeltaExportItem(dstEnd, sgLevels[i].item);
dstEnd = DeltaExportObject(dstEnd, sgLevels[i].object);
dstEnd = DeltaExportMonster(dstEnd, sgLevels[i].monster);
size = msg_comp_level(dst, dstEnd);
dthread_send_delta(pnum, i + CMD_DLEVEL_0, dst, size);
}
dstEnd = DeltaExportJunk(dstEnd);
size = msg_comp_level(dst, dstEnd);
dthread_send_delta(pnum, CMD_DLEVEL_JUNK, dst, size);
mem_free_dbg(dst);
}
src = 0;
dthread_send_delta(player_num, CMD_DLEVEL_END, &src, 1);
dthread_send_delta(pnum, CMD_DLEVEL_END, &src, 1);
}
// 67618C: using guessed type char sgbDeltaChanged;
BYTE *__fastcall DeltaExportItem(BYTE *dst, TCmdPItem *src)
{
@ -277,39 +268,33 @@ BYTE *__fastcall DeltaExportMonster(BYTE *dst, DMonsterStr *src)
BYTE *__fastcall DeltaExportJunk(BYTE *dst)
{
BYTE *v1; // ebx
DJunk *v2; // edi
MultiQuests *v3; // esi
unsigned char *v4; // edi
int *v5; // ebp
v1 = dst;
v2 = &sgJunk;
v3 = sgJunk.quests;
do {
if (v2->portal[0].x == LOBYTE(-1)) {
*v1++ = -1;
int i;
MultiQuests *mq;
DPortal *pD;
for (i = 0; i < MAXPORTAL; i++) {
pD = &sgJunk.portal[i];
if (pD->x == 0xFF) {
*dst = 0xFF;
dst++;
} else {
memcpy(v1, v2, 5u);
v1 += 5;
memcpy(dst, pD, sizeof(*pD));
dst += sizeof(*pD);
}
v2 = (DJunk *)((char *)v2 + 5);
} while ((signed int)v2 < (signed int)sgJunk.quests);
v4 = &quests[0]._qactive;
v5 = &questlist[0]._qflags;
do {
if (*(_BYTE *)v5 & 1) {
v3->qlog = v4[18];
v3->qstate = *v4;
v3->qvar1 = v4[13];
memcpy(v1, v3, 3u);
v1 += 3;
++v3;
}
for (i = 0; i < MAXQUESTS; i++) {
if (questlist[i]._qflags & 1) {
mq = &sgJunk.quests[i];
mq->qlog = quests[i]._qlog;
mq->qstate = quests[i]._qactive;
mq->qvar1 = quests[i]._qvar1;
memcpy(dst, mq, sizeof(*mq));
dst += sizeof(*mq);
}
v5 += 5;
v4 += 24;
} while ((signed int)v5 < (signed int)&questlist[16]._qflags);
return v1;
}
return dst;
}
int __fastcall msg_comp_level(BYTE *buffer, BYTE *end)
@ -325,13 +310,12 @@ int __fastcall msg_comp_level(BYTE *buffer, BYTE *end)
void __cdecl delta_init()
{
sgbDeltaChanged = 0;
sgbDeltaChanged = FALSE;
memset(&sgJunk, 0xFF, sizeof(sgJunk));
memset(sgLevels, 0xFF, sizeof(sgLevels));
memset(sgLocals, 0, sizeof(sgLocals));
deltaload = FALSE;
}
// 67618C: using guessed type char sgbDeltaChanged;
// 676190: using guessed type int deltaload;
void __fastcall delta_kill_monster(int mi, BYTE x, BYTE y, BYTE bLevel)
@ -339,7 +323,7 @@ void __fastcall delta_kill_monster(int mi, BYTE x, BYTE y, BYTE bLevel)
DMonsterStr *pD;
if (gbMaxPlayers != 1) {
sgbDeltaChanged = 1;
sgbDeltaChanged = TRUE;
pD = &sgLevels[bLevel].monster[mi];
pD->_mx = x;
pD->_my = y;
@ -347,7 +331,6 @@ void __fastcall delta_kill_monster(int mi, BYTE x, BYTE y, BYTE bLevel)
pD->_mhitpoints = 0;
}
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
void __fastcall delta_monster_hp(int mi, int hp, BYTE bLevel)
@ -355,13 +338,12 @@ void __fastcall delta_monster_hp(int mi, int hp, BYTE bLevel)
DMonsterStr *pD;
if (gbMaxPlayers != 1) {
sgbDeltaChanged = 1;
sgbDeltaChanged = TRUE;
pD = &sgLevels[bLevel].monster[mi];
if (pD->_mhitpoints > hp)
pD->_mhitpoints = hp;
}
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
void __fastcall delta_sync_monster(TCmdLocParam1 *packet, BYTE level)
@ -369,7 +351,7 @@ void __fastcall delta_sync_monster(TCmdLocParam1 *packet, BYTE level)
DMonsterStr *pD;
if (gbMaxPlayers != 1) {
sgbDeltaChanged = 1;
sgbDeltaChanged = TRUE;
pD = &sgLevels[level].monster[(BYTE)packet->bCmd];
if (pD->_mhitpoints) {
pD->_mx = packet->x;
@ -379,7 +361,6 @@ void __fastcall delta_sync_monster(TCmdLocParam1 *packet, BYTE level)
}
}
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
void __fastcall delta_sync_golem(TCmdGolem *pG, int pnum, BYTE bLevel)
@ -387,7 +368,7 @@ void __fastcall delta_sync_golem(TCmdGolem *pG, int pnum, BYTE bLevel)
DMonsterStr *pD;
if (gbMaxPlayers != 1) {
sgbDeltaChanged = 1;
sgbDeltaChanged = TRUE;
pD = &sgLevels[bLevel].monster[pnum];
pD->_mx = pG->_mx;
pD->_my = pG->_my;
@ -397,7 +378,6 @@ void __fastcall delta_sync_golem(TCmdGolem *pG, int pnum, BYTE bLevel)
pD->_mhitpoints = pG->_mhitpoints;
}
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
void __fastcall delta_leave_sync(BYTE bLevel)
@ -413,7 +393,7 @@ void __fastcall delta_leave_sync(BYTE bLevel)
for (i = 0; i < nummonsters; ++i) {
ma = monstactive[i];
if (monster[ma]._mhitpoints) {
sgbDeltaChanged = 1;
sgbDeltaChanged = TRUE;
pD = &sgLevels[bLevel].monster[ma];
pD->_mx = monster[ma]._mx;
pD->_my = monster[ma]._my;
@ -428,7 +408,6 @@ void __fastcall delta_leave_sync(BYTE bLevel)
}
}
// 43C17D: could not find valid save-restore pair for edi
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
BOOL __fastcall delta_portal_inited(int i)
@ -443,68 +422,44 @@ BOOL __fastcall delta_quest_inited(int i)
void __fastcall DeltaAddItem(int ii)
{
int v1; // eax
int v2; // ecx
signed int v3; // ebp
DLevel *v4; // edx
DLevel *v5; // edi
char v6; // bl
int v7; // esi
signed int v8; // esi
int v9; // eax
char v10; // cl
char v11; // cl
v1 = ii;
if (gbMaxPlayers != 1) {
v2 = currlevel;
v3 = 0;
v4 = &sgLevels[v2];
v5 = &sgLevels[v2];
while (1) {
v6 = v5->item[0].bCmd;
if (v5->item[0].bCmd != -1) {
v7 = v1;
if ((unsigned short)v5->item[0].wIndx == item[v1].IDidx
&& v5->item[0].wCI == item[v7]._iCreateInfo
&& v5->item[0].dwSeed == item[v7]._iSeed
&& (v6 == 1 || !v6)) {
break;
}
}
++v3;
v5 = (DLevel *)((char *)v5 + 22);
if (v3 >= 127) {
v8 = 0;
while (v4->item[0].bCmd != -1) {
++v8;
v4 = (DLevel *)((char *)v4 + 22);
if (v8 >= 127)
return;
}
v4->item[0].bCmd = 0;
v9 = 368 * v1;
v10 = *((_BYTE *)&item[0]._ix + v9);
sgbDeltaChanged = 1;
v4->item[0].x = v10;
v4->item[0].y = *((_BYTE *)&item[0]._iy + v9);
v4->item[0].wIndx = *(_WORD *)((char *)&item[0].IDidx + v9);
v4->item[0].wCI = *(short *)((char *)&item[0]._iCreateInfo + v9);
v4->item[0].dwSeed = *(int *)((char *)&item[0]._iSeed + v9);
v4->item[0].bId = *((_BYTE *)&item[0]._iIdentified + v9);
v4->item[0].bDur = *((_BYTE *)&item[0]._iDurability + v9);
v4->item[0].bMDur = *((_BYTE *)&item[0]._iMaxDur + v9);
v4->item[0].bCh = *((_BYTE *)&item[0]._iCharges + v9);
v11 = *((_BYTE *)&item[0]._iMaxCharges + v9);
_LOWORD(v9) = *(_WORD *)((char *)&item[0]._ivalue + v9);
v4->item[0].bMCh = v11;
v4->item[0].wValue = v9;
return;
}
int i;
TCmdPItem *pD;
if (gbMaxPlayers == 1) {
return;
}
for (i = 0; i < MAXITEMS; i++) {
pD = &sgLevels[currlevel].item[i];
if (pD->bCmd != 0xFF
&& pD->wIndx == item[ii].IDidx
&& pD->wCI == item[ii]._iCreateInfo
&& pD->dwSeed == item[ii]._iSeed
&& (pD->bCmd == CMD_WALKXY || pD->bCmd == CMD_STAND)) {
return;
}
}
for (i = 0; i < MAXITEMS; i++) {
pD = &sgLevels[currlevel].item[i];
if (pD->bCmd == 0xFF) {
pD->bCmd = CMD_STAND;
sgbDeltaChanged = TRUE;
pD->x = item[ii]._ix;
pD->y = item[ii]._iy;
pD->wIndx = item[ii].IDidx;
pD->wCI = item[ii]._iCreateInfo;
pD->dwSeed = item[ii]._iSeed;
pD->bId = item[ii]._iIdentified;
pD->bDur = item[ii]._iDurability;
pD->bMDur = item[ii]._iMaxDur;
pD->bCh = item[ii]._iCharges;
pD->bMCh = item[ii]._iMaxCharges;
pD->wValue = item[ii]._ivalue;
return;
}
}
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
void __cdecl DeltaSaveLevel()
@ -1037,9 +992,8 @@ void __fastcall NetSendCmdString(int pmask, const char *pszStr)
void __fastcall RemovePlrPortal(int pnum)
{
memset(&sgJunk.portal[pnum], 0xFF, sizeof(sgJunk.portal[pnum]));
sgbDeltaChanged = 1;
sgbDeltaChanged = TRUE;
}
// 67618C: using guessed type char sgbDeltaChanged;
int __fastcall ParseCmd(int pnum, TCmd *pCmd)
{
@ -1268,9 +1222,8 @@ void __fastcall DeltaImportData(BYTE cmd, DWORD recv_offset)
}
sgbDeltaChunks++;
sgbDeltaChanged = 1;
sgbDeltaChanged = TRUE;
}
// 67618C: using guessed type char sgbDeltaChanged;
// 67618D: using guessed type char sgbDeltaChunks;
BYTE *__fastcall DeltaImportItem(BYTE *src, TCmdPItem *dst)
@ -1317,52 +1270,35 @@ BYTE *__fastcall DeltaImportMonster(BYTE *src, DMonsterStr *dst)
void __fastcall DeltaImportJunk(BYTE *src)
{
_BYTE *v1; // ebx
int v2; // edi
DJunk *v3; // esi
char result; // al
MultiQuests *v5; // esi
unsigned char *v6; // edi
int *v7; // ebp
v1 = (_BYTE *)src;
v2 = 0;
v3 = &sgJunk;
do {
if (*v1 == -1) {
memset(v3, 255, 5u);
++v1;
SetPortalStats(v2, 0, 0, 0, 0, 0);
int i;
for (i = 0; i < MAXPORTAL; i++) {
if (*src == 0xFF) {
memset(&sgJunk.portal[i], 0xFF, sizeof(DPortal));
src++;
SetPortalStats(i, 0, 0, 0, 0, 0);
} else {
memcpy(v3, v1, 5u);
v1 += 5;
memcpy(&sgJunk.portal[i], src, sizeof(DPortal));
src += sizeof(DPortal);
SetPortalStats(
v2,
i,
1,
(unsigned char)v3->portal[0].x,
(unsigned char)v3->portal[0].y,
(unsigned char)v3->portal[0].level,
(unsigned char)v3->portal[0].ltype);
sgJunk.portal[i].x,
sgJunk.portal[i].y,
sgJunk.portal[i].level,
sgJunk.portal[i].ltype);
}
v3 = (DJunk *)((char *)v3 + 5);
++v2;
} while ((signed int)v3 < (signed int)sgJunk.quests);
v5 = sgJunk.quests;
v6 = &quests[0]._qactive;
v7 = &questlist[0]._qflags;
do {
if (*(_BYTE *)v7 & 1) {
memcpy(v5, v1, 3u);
*(_DWORD *)(v6 + 18) = (unsigned char)v5->qlog;
*v6 = v5->qstate;
result = v5->qvar1;
v1 += 3;
v6[13] = result;
++v5;
}
for (i = 0; i < MAXMULTIQUESTS; i++) {
if (questlist[i]._qflags & 1) {
memcpy(&sgJunk.quests[i], src, sizeof(MultiQuests));
src += sizeof(MultiQuests);
quests[i]._qlog = sgJunk.quests[i].qlog;
quests[i]._qactive = sgJunk.quests[i].qstate;
quests[i]._qvar1 = sgJunk.quests[i].qvar1;
}
v7 += 5;
v6 += 24;
} while ((signed int)v7 < (signed int)&questlist[16]._qflags);
}
}
int __fastcall On_SYNCDATA(void *packet, int pnum)
@ -1553,13 +1489,13 @@ BOOL __fastcall delta_get_item(TCmdGItem *pI, BYTE bLevel)
if (v5->item[0].bCmd == 1)
return 1;
if (!v6) {
sgbDeltaChanged = 1;
sgbDeltaChanged = TRUE;
v5->item[0].bCmd = 1;
return 1;
}
if (v6 == 2) {
v5->item[0].bCmd = -1;
sgbDeltaChanged = 1;
sgbDeltaChanged = TRUE;
return 1;
}
TermMsg("delta:1");
@ -1574,7 +1510,7 @@ BOOL __fastcall delta_get_item(TCmdGItem *pI, BYTE bLevel)
if (v9 >= 127)
return 1;
}
sgbDeltaChanged = 1;
sgbDeltaChanged = TRUE;
v8->item[0].bCmd = 1;
v8->item[0].x = v2->x;
v8->item[0].y = v2->y;
@ -1591,7 +1527,6 @@ BOOL __fastcall delta_get_item(TCmdGItem *pI, BYTE bLevel)
}
return 1;
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
int __fastcall On_GOTOAGETITEM(TCmdLocParam1 *pCmd, int pnum)
@ -1690,51 +1625,36 @@ int __fastcall On_PUTITEM(TCmdPItem *pCmd, int pnum)
void __fastcall delta_put_item(TCmdPItem *pI, int x, int y, BYTE bLevel)
{
TCmdPItem *v4; // ebx
int v5; // eax
DLevel *v6; // esi
DLevel *v7; // edi
char v8; // al
signed int v9; // eax
char v10; // [esp+Ch] [ebp-4h]
signed int bLevela; // [esp+1Ch] [ebp+Ch]
v10 = x;
v4 = pI;
int i;
TCmdPItem *pD;
if (gbMaxPlayers != 1) {
v5 = bLevel;
bLevela = 0;
v6 = &sgLevels[v5];
v7 = &sgLevels[v5];
do {
v8 = v7->item[0].bCmd;
if (v7->item[0].bCmd != 1
&& v8 != -1
&& v7->item[0].wIndx == v4->wIndx
&& v7->item[0].wCI == v4->wCI
&& v7->item[0].dwSeed == v4->dwSeed) {
if (v8 == 2)
for (i = 0; i < MAXITEMS; i++) {
pD = &sgLevels[bLevel].item[i];
if (pD->bCmd != CMD_WALKXY
&& pD->bCmd != 0xFF
&& pD->wIndx == pI->wIndx
&& pD->wCI == pI->wCI
&& pD->dwSeed == pI->dwSeed) {
if (pD->bCmd == CMD_ACK_PLRINFO)
return;
TermMsg("Trying to drop a floor item?");
}
++bLevela;
v7 = (DLevel *)((char *)v7 + 22);
} while (bLevela < 127);
v9 = 0;
while (v6->item[0].bCmd != -1) {
++v9;
v6 = (DLevel *)((char *)v6 + 22);
if (v9 >= 127)
}
for (i = 0; i < MAXITEMS; i++) {
pD = &sgLevels[bLevel].item[i];
if (pD->bCmd == 0xFF) {
sgbDeltaChanged = TRUE;
memcpy(pD, pI, sizeof(TCmdPItem));
pD->bCmd = CMD_ACK_PLRINFO;
pD->x = x;
pD->y = y;
return;
}
}
sgbDeltaChanged = 1;
memcpy(v6, v4, sizeof(TCmdPItem));
v6->item[0].x = v10;
v6->item[0].bCmd = 2;
v6->item[0].y = y;
}
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
void __fastcall check_update_plr(int pnum)
@ -2215,11 +2135,10 @@ int __fastcall On_OPENDOOR(TCmdParam1 *pCmd, int pnum)
void __fastcall delta_sync_object(int oi, BYTE bCmd, BYTE bLevel)
{
if (gbMaxPlayers != 1) {
sgbDeltaChanged = 1;
sgbDeltaChanged = TRUE;
sgLevels[bLevel].object[oi].bCmd = bCmd;
}
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
int __fastcall On_CLOSEDOOR(TCmdParam1 *pCmd, int pnum)
@ -2402,14 +2321,13 @@ int __fastcall On_ACTIVATEPORTAL(TCmdLocParam3 *pCmd, int pnum)
void __fastcall delta_open_portal(int pnum, BYTE x, BYTE y, BYTE bLevel, BYTE bLType, BYTE bSetLvl)
{
sgbDeltaChanged = 1;
sgbDeltaChanged = TRUE;
sgJunk.portal[pnum].x = x;
sgJunk.portal[pnum].y = y;
sgJunk.portal[pnum].level = bLevel;
sgJunk.portal[pnum].ltype = bLType;
sgJunk.portal[pnum].setlvl = bSetLvl;
}
// 67618C: using guessed type char sgbDeltaChanged;
int __fastcall On_DEACTIVATEPORTAL(TCmd *pCmd, int pnum)
{
@ -2501,7 +2419,7 @@ int __fastcall On_SYNCQUEST(TCmdQuest *pCmd, int pnum)
else {
if (pnum != myplr)
SetMultiQuest(pCmd->q, pCmd->qstate, pCmd->qlog, pCmd->qvar1);
sgbDeltaChanged = 1;
sgbDeltaChanged = TRUE;
}
return sizeof(*pCmd);

Loading…
Cancel
Save