Browse Source

Delta data (#504)

* Clean up DeltaImport*
* Clean up DeltaExportData related functions
pull/25/head
Anders Jenbo 7 years ago committed by GitHub
parent
commit
bd310ff8d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 218
      Source/msg.cpp
  2. 18
      Source/msg.h
  3. 48
      structs.h

218
Source/msg.cpp

@ -8,7 +8,7 @@ static int sgnCurrMegaPlayer;
static DLevel sgLevels[NUMLEVELS]; static DLevel sgLevels[NUMLEVELS];
static BYTE sbLastCmd; static BYTE sbLastCmd;
static TMegaPkt *sgpCurrPkt; static TMegaPkt *sgpCurrPkt;
static char sgRecvBuf[sizeof(DLevel) + 1]; static BYTE sgRecvBuf[sizeof(DLevel) + 1];
static BYTE sgbRecvCmd; static BYTE sgbRecvCmd;
static LocalLevel sgLocals[NUMLEVELS]; static LocalLevel sgLocals[NUMLEVELS];
static DJunk sgJunk; static DJunk sgJunk;
@ -198,14 +198,14 @@ void __cdecl msg_pre_packet()
void __fastcall DeltaExportData(int pnum) void __fastcall DeltaExportData(int pnum)
{ {
char *v1; // edi BYTE *v1; // edi
DObjectStr *v2; // esi DObjectStr *v2; // esi
void *v3; // ebx BYTE *v3; // ebx
void *v4; // eax BYTE *v4; // eax
void *v5; // eax BYTE *v5; // eax
void *v6; // eax BYTE *v6; // eax
int v7; // eax int v7; // eax
void *v8; // eax BYTE *v8; // eax
int v9; // eax int v9; // eax
int player_num; // [esp+0h] [ebp-Ch] int player_num; // [esp+0h] [ebp-Ch]
int v11; // [esp+4h] [ebp-8h] int v11; // [esp+4h] [ebp-8h]
@ -214,13 +214,13 @@ void __fastcall DeltaExportData(int pnum)
player_num = pnum; player_num = pnum;
if (sgbDeltaChanged) { if (sgbDeltaChanged) {
v11 = 0; v11 = 0;
v1 = (char *)DiabloAllocPtr(4722); v1 = (BYTE *)DiabloAllocPtr(4722);
v2 = sgLevels[0].object; v2 = sgLevels[0].object;
v3 = v1 + 1; v3 = v1 + 1;
do { do {
v4 = DeltaExportItem(v3, &v2[-2794]); v4 = DeltaExportItem(v3, (TCmdPItem *)&v2[-2794]);
v5 = DeltaExportObject(v4, v2); v5 = DeltaExportObject(v4, v2);
v6 = DeltaExportMonster(v5, &v2[127]); v6 = DeltaExportMonster(v5, (DMonsterStr *)&v2[127]);
v7 = msg_comp_level(v1, v6); v7 = msg_comp_level(v1, v6);
dthread_send_delta(player_num, (_BYTE)v11++ + CMD_DLEVEL_0, v1, v7); dthread_send_delta(player_num, (_BYTE)v11++ + CMD_DLEVEL_0, v1, v7);
v2 += 4721; v2 += 4721;
@ -235,68 +235,57 @@ void __fastcall DeltaExportData(int pnum)
} }
// 67618C: using guessed type char sgbDeltaChanged; // 67618C: using guessed type char sgbDeltaChanged;
void *__fastcall DeltaExportItem(void *dst, void *src) BYTE *__fastcall DeltaExportItem(BYTE *dst, TCmdPItem *src)
{ {
_BYTE *v2; // edi int i;
_BYTE *v3; // esi
signed int v4; // ebx
v2 = (unsigned char *)src; for (i = 0; i < MAXITEMS; i++) {
v3 = (unsigned char *)dst; if (src->bCmd == 0xFF) {
v4 = 127; *dst = 0xFF;
do { dst++;
if (*v2 == -1) {
*v3++ = -1;
} else { } else {
memcpy(v3, v2, 0x16u); memcpy(dst, src, sizeof(TCmdPItem));
v3 += 22; dst += sizeof(TCmdPItem);
} }
v2 += 22; src++;
--v4; }
} while (v4);
return v3; return dst;
} }
void *__fastcall DeltaExportObject(void *dst, void *src) BYTE *__fastcall DeltaExportObject(BYTE *dst, DObjectStr *src)
{ {
char *v2; // esi memcpy(dst, src, sizeof(DObjectStr) * MAXOBJECTS);
return dst + sizeof(DObjectStr) * MAXOBJECTS;
v2 = (char *)dst;
memcpy(dst, src, 0x7Fu);
return v2 + 127;
} }
void *__fastcall DeltaExportMonster(void *dst, void *src) BYTE *__fastcall DeltaExportMonster(BYTE *dst, DMonsterStr *src)
{ {
_BYTE *v2; // edi int i;
_BYTE *v3; // esi
signed int v4; // ebx
v2 = (unsigned char *)src; for (i = 0; i < MAXMONSTERS; i++) {
v3 = (unsigned char *)dst; if (*(BYTE *)src == 0xFF) {
v4 = MAXMONSTERS; *dst = 0xFF;
do { dst++;
if (*v2 == -1) {
*v3++ = -1;
} else { } else {
memcpy(v3, v2, 9u); memcpy(dst, src, sizeof(DMonsterStr));
v3 += 9; dst += sizeof(DMonsterStr);
} }
v2 += 9; src++;
--v4; }
} while (v4);
return v3; return dst;
} }
void *__fastcall DeltaExportJunk(void *dst) BYTE *__fastcall DeltaExportJunk(BYTE *dst)
{ {
char *v1; // ebx BYTE *v1; // ebx
DJunk *v2; // edi DJunk *v2; // edi
MultiQuests *v3; // esi MultiQuests *v3; // esi
unsigned char *v4; // edi unsigned char *v4; // edi
int *v5; // ebp int *v5; // ebp
v1 = (char *)dst; v1 = dst;
v2 = &sgJunk; v2 = &sgJunk;
v3 = sgJunk.quests; v3 = sgJunk.quests;
do { do {
@ -325,24 +314,22 @@ void *__fastcall DeltaExportJunk(void *dst)
return v1; return v1;
} }
int __fastcall msg_comp_level(char *begin, void *end) int __fastcall msg_comp_level(BYTE *buffer, BYTE *end)
{ {
char *v2; // esi int size, pkSize;
int v3; // edi
int v4; // eax size = end - buffer - 1;
pkSize = PkwareCompress(buffer + 1, size);
*buffer = size != pkSize;
v2 = begin; return pkSize + 1;
v3 = (char *)end - begin - 1;
v4 = PkwareCompress(begin + 1, v3);
*v2 = v3 != v4;
return v4 + 1;
} }
void __cdecl delta_init() void __cdecl delta_init()
{ {
sgbDeltaChanged = 0; sgbDeltaChanged = 0;
memset(&sgJunk, 255, sizeof(sgJunk)); memset(&sgJunk, 0xFF, sizeof(sgJunk));
memset(sgLevels, 255, sizeof(sgLevels)); memset(sgLevels, 0xFF, sizeof(sgLevels));
memset(sgLocals, 0, sizeof(sgLocals)); memset(sgLocals, 0, sizeof(sgLocals));
deltaload = 0; deltaload = 0;
} }
@ -448,12 +435,12 @@ void __fastcall delta_leave_sync(BYTE bLevel)
BOOL __fastcall delta_portal_inited(int i) BOOL __fastcall delta_portal_inited(int i)
{ {
return sgJunk.portal[i].x == -1; return sgJunk.portal[i].x == 0xFF;
} }
BOOL __fastcall delta_quest_inited(int i) BOOL __fastcall delta_quest_inited(int i)
{ {
return sgJunk.quests[i].qstate != -1; return sgJunk.quests[i].qstate != 0xFF;
} }
void __fastcall DeltaAddItem(int ii) void __fastcall DeltaAddItem(int ii)
@ -590,7 +577,7 @@ void __cdecl DeltaLoadLevel()
v40 = 0; v40 = 0;
v1 = &monster[0]._mfuty; v1 = &monster[0]._mfuty;
do { do {
if (sgLevels[currlevel].monster[v40]._mx != -1) { if (sgLevels[currlevel].monster[v40]._mx != 0xFF) {
M_ClearSquares(v0); M_ClearSquares(v0);
v2 = v40 * 9 + 4721 * currlevel; v2 = v40 * 9 + 4721 * currlevel;
v3 = *((unsigned char *)&sgLevels[0].monster[0]._mx + v2); v3 = *((unsigned char *)&sgLevels[0].monster[0]._mx + v2);
@ -644,7 +631,7 @@ void __cdecl DeltaLoadLevel()
do { do {
v9 = v8 + 4721 * currlevel; v9 = v8 + 4721 * currlevel;
v10 = *(&sgLevels[0].item[0].bCmd + v9); v10 = *(&sgLevels[0].item[0].bCmd + v9);
if (v10 != -1) { if (v10 != 0xFF) {
if (v10 == 1) { if (v10 == 1) {
v11 = FindGetItem( v11 = FindGetItem(
*(unsigned short *)((char *)&sgLevels[0].item[0].wIndx + v9), *(unsigned short *)((char *)&sgLevels[0].item[0].wIndx + v9),
@ -1126,7 +1113,7 @@ void __fastcall NetSendCmdString(int pmask, const char *pszStr)
void __fastcall RemovePlrPortal(int pnum) void __fastcall RemovePlrPortal(int pnum)
{ {
memset(&sgJunk.portal[pnum], 255, sizeof(sgJunk.portal[pnum])); memset(&sgJunk.portal[pnum], 0xFF, sizeof(sgJunk.portal[pnum]));
sgbDeltaChanged = 1; sgbDeltaChanged = 1;
} }
// 67618C: using guessed type char sgbDeltaChanged; // 67618C: using guessed type char sgbDeltaChanged;
@ -1354,86 +1341,73 @@ LABEL_16:
void __fastcall DeltaImportData(BYTE cmd, DWORD recv_offset) void __fastcall DeltaImportData(BYTE cmd, DWORD recv_offset)
{ {
unsigned char v2; // bl BYTE i;
int v3; // esi BYTE *src;
void *v4; // eax
void *v5; // eax
v2 = cmd;
if (sgRecvBuf[0]) if (sgRecvBuf[0])
PkwareDecompress(&sgRecvBuf[1], recv_offset, 4721); PkwareDecompress(&sgRecvBuf[1], recv_offset, 4721);
if (v2 == CMD_DLEVEL_JUNK) {
DeltaImportJunk(&sgRecvBuf[1]); src = &sgRecvBuf[1];
} else if (v2 < CMD_DLEVEL_0 || v2 > CMD_DLEVEL_16) { if (cmd == CMD_DLEVEL_JUNK) {
TermMsg("msg:1"); DeltaImportJunk(src);
} else if (cmd >= CMD_DLEVEL_0 && cmd <= CMD_DLEVEL_16) {
i = cmd - CMD_DLEVEL_0;
src = DeltaImportItem(src, sgLevels[i].item);
src = DeltaImportObject(src, sgLevels[i].object);
DeltaImportMonster(src, sgLevels[i].monster);
} else { } else {
v3 = (unsigned char)(v2 - CMD_DLEVEL_0); TermMsg("msg:1");
v4 = DeltaImportItem(&sgRecvBuf[1], &sgLevels[v3]);
v5 = DeltaImportObject(v4, sgLevels[v3].object);
DeltaImportMonster(v5, sgLevels[v3].monster);
} }
++sgbDeltaChunks;
sgbDeltaChunks++;
sgbDeltaChanged = 1; sgbDeltaChanged = 1;
} }
// 67618C: using guessed type char sgbDeltaChanged; // 67618C: using guessed type char sgbDeltaChanged;
// 67618D: using guessed type char sgbDeltaChunks; // 67618D: using guessed type char sgbDeltaChunks;
void *__fastcall DeltaImportItem(void *src, void *dst) BYTE *__fastcall DeltaImportItem(BYTE *src, TCmdPItem *dst)
{ {
char *v2; // edi int i;
_BYTE *v3; // esi
signed int v4; // ebx
v2 = (char *)dst; for (i = 0; i < MAXITEMS; i++) {
v3 = (unsigned char *)src; if (*src == 0xFF) {
v4 = 127; memset(dst, 0xFF, sizeof(TCmdPItem));
do { src++;
if (*v3 == -1) {
memset(v2, 255, 0x16u);
++v3;
} else { } else {
memcpy(v2, v3, 0x16u); memcpy(dst, src, sizeof(TCmdPItem));
v3 += 22; src += sizeof(TCmdPItem);
} }
v2 += 22; dst++;
--v4; }
} while (v4);
return v3; return src;
} }
void *__fastcall DeltaImportObject(void *src, void *dst) BYTE *__fastcall DeltaImportObject(BYTE *src, DObjectStr *dst)
{ {
char *v2; // esi memcpy(dst, src, sizeof(DObjectStr) * MAXOBJECTS);
return src + sizeof(DObjectStr) * MAXOBJECTS;
v2 = (char *)src;
memcpy(dst, src, 0x7Fu);
return v2 + 127;
} }
void *__fastcall DeltaImportMonster(void *src, void *dst) BYTE *__fastcall DeltaImportMonster(BYTE *src, DMonsterStr *dst)
{ {
char *v2; // edi int i;
_BYTE *v3; // esi
signed int v4; // ebx
v2 = (char *)dst; for (i = 0; i < MAXMONSTERS; i++) {
v3 = (unsigned char *)src; if (*src == 0xFF) {
v4 = MAXMONSTERS; memset(dst, 0xFF, sizeof(DMonsterStr));
do { src++;
if (*v3 == -1) {
memset(v2, 255, 9u);
++v3;
} else { } else {
memcpy(v2, v3, 9u); memcpy(dst, src, sizeof(DMonsterStr));
v3 += 9; src += sizeof(DMonsterStr);
} }
v2 += 9; dst++;
--v4; }
} while (v4);
return v3; return src;
} }
void __fastcall DeltaImportJunk(void *src) void __fastcall DeltaImportJunk(BYTE *src)
{ {
_BYTE *v1; // ebx _BYTE *v1; // ebx
int v2; // edi int v2; // edi

18
Source/msg.h

@ -15,11 +15,11 @@ int __cdecl msg_wait_for_turns();
void __cdecl msg_process_net_packets(); void __cdecl msg_process_net_packets();
void __cdecl msg_pre_packet(); void __cdecl msg_pre_packet();
void __fastcall DeltaExportData(int pnum); void __fastcall DeltaExportData(int pnum);
void *__fastcall DeltaExportItem(void *dst, void *src); BYTE *__fastcall DeltaExportItem(BYTE *dst, TCmdPItem *src);
void *__fastcall DeltaExportObject(void *dst, void *src); BYTE *__fastcall DeltaExportObject(BYTE *dst, DObjectStr *src);
void *__fastcall DeltaExportMonster(void *dst, void *src); BYTE *__fastcall DeltaExportMonster(BYTE *dst, DMonsterStr *src);
void *__fastcall DeltaExportJunk(void *dst); BYTE *__fastcall DeltaExportJunk(BYTE *dst);
int __fastcall msg_comp_level(char *begin, void *end); int __fastcall msg_comp_level(BYTE *buffer, BYTE *end);
void __cdecl delta_init(); void __cdecl delta_init();
void __fastcall delta_kill_monster(int mi, BYTE x, BYTE y, BYTE bLevel); void __fastcall delta_kill_monster(int mi, BYTE x, BYTE y, BYTE bLevel);
void __fastcall delta_monster_hp(int mi, int hp, BYTE bLevel); void __fastcall delta_monster_hp(int mi, int hp, BYTE bLevel);
@ -55,10 +55,10 @@ void __fastcall RemovePlrPortal(int pnum);
int __fastcall ParseCmd(int pnum, TCmd *pCmd); int __fastcall ParseCmd(int pnum, TCmd *pCmd);
int __fastcall On_DLEVEL(int pnum, TCmdPlrInfoHdr *pCmd); int __fastcall On_DLEVEL(int pnum, TCmdPlrInfoHdr *pCmd);
void __fastcall DeltaImportData(BYTE cmd, DWORD recv_offset); void __fastcall DeltaImportData(BYTE cmd, DWORD recv_offset);
void *__fastcall DeltaImportItem(void *src, void *dst); BYTE *__fastcall DeltaImportItem(BYTE *src, TCmdPItem *dst);
void *__fastcall DeltaImportObject(void *src, void *dst); BYTE *__fastcall DeltaImportObject(BYTE *src, DObjectStr *dst);
void *__fastcall DeltaImportMonster(void *src, void *dst); BYTE *__fastcall DeltaImportMonster(BYTE *src, DMonsterStr *dst);
void __fastcall DeltaImportJunk(void *src); void __fastcall DeltaImportJunk(BYTE *src);
int __fastcall On_SYNCDATA(void *packet, int pnum); int __fastcall On_SYNCDATA(void *packet, int pnum);
int __fastcall On_WALKXY(TCmdLoc *pCmd, int pnum); int __fastcall On_WALKXY(TCmdLoc *pCmd, int pnum);
int __fastcall On_ADDSTR(TCmdParam1 *pCmd, int pnum); int __fastcall On_ADDSTR(TCmdParam1 *pCmd, int pnum);

48
structs.h

@ -696,24 +696,24 @@ typedef struct PortalStruct {
#pragma pack(push, 1) #pragma pack(push, 1)
typedef struct TCmd { typedef struct TCmd {
char bCmd; BYTE bCmd;
} TCmd; } TCmd;
typedef struct TCmdLoc { typedef struct TCmdLoc {
char bCmd; BYTE bCmd;
BYTE x; BYTE x;
BYTE y; BYTE y;
} TCmdLoc; } TCmdLoc;
typedef struct TCmdLocParam1 { typedef struct TCmdLocParam1 {
char bCmd; BYTE bCmd;
BYTE x; BYTE x;
BYTE y; BYTE y;
WORD wParam1; WORD wParam1;
} TCmdLocParam1; } TCmdLocParam1;
typedef struct TCmdLocParam2 { typedef struct TCmdLocParam2 {
char bCmd; BYTE bCmd;
BYTE x; BYTE x;
BYTE y; BYTE y;
WORD wParam1; WORD wParam1;
@ -721,7 +721,7 @@ typedef struct TCmdLocParam2 {
} TCmdLocParam2; } TCmdLocParam2;
typedef struct TCmdLocParam3 { typedef struct TCmdLocParam3 {
char bCmd; BYTE bCmd;
BYTE x; BYTE x;
BYTE y; BYTE y;
WORD wParam1; WORD wParam1;
@ -730,25 +730,25 @@ typedef struct TCmdLocParam3 {
} TCmdLocParam3; } TCmdLocParam3;
typedef struct TCmdParam1 { typedef struct TCmdParam1 {
char bCmd; BYTE bCmd;
WORD wParam1; WORD wParam1;
} TCmdParam1; } TCmdParam1;
typedef struct TCmdParam2 { typedef struct TCmdParam2 {
char bCmd; BYTE bCmd;
WORD wParam1; WORD wParam1;
WORD wParam2; WORD wParam2;
} TCmdParam2; } TCmdParam2;
typedef struct TCmdParam3 { typedef struct TCmdParam3 {
char bCmd; BYTE bCmd;
WORD wParam1; WORD wParam1;
WORD wParam2; WORD wParam2;
WORD wParam3; WORD wParam3;
} TCmdParam3; } TCmdParam3;
typedef struct TCmdGolem { typedef struct TCmdGolem {
char bCmd; BYTE bCmd;
BYTE _mx; BYTE _mx;
BYTE _my; BYTE _my;
BYTE _mdir; BYTE _mdir;
@ -758,7 +758,7 @@ typedef struct TCmdGolem {
} TCmdGolem; } TCmdGolem;
typedef struct TCmdQuest { typedef struct TCmdQuest {
char bCmd; BYTE bCmd;
BYTE q; BYTE q;
BYTE qstate; BYTE qstate;
BYTE qlog; BYTE qlog;
@ -766,7 +766,7 @@ typedef struct TCmdQuest {
} TCmdQuest; } TCmdQuest;
typedef struct TCmdGItem { typedef struct TCmdGItem {
char bCmd; BYTE bCmd;
BYTE bMaster; BYTE bMaster;
BYTE bPnum; BYTE bPnum;
BYTE bCursitem; BYTE bCursitem;
@ -787,7 +787,7 @@ typedef struct TCmdGItem {
} TCmdGItem; } TCmdGItem;
typedef struct TCmdPItem { typedef struct TCmdPItem {
char bCmd; BYTE bCmd;
BYTE x; BYTE x;
BYTE y; BYTE y;
WORD wIndx; WORD wIndx;
@ -803,7 +803,7 @@ typedef struct TCmdPItem {
} TCmdPItem; } TCmdPItem;
typedef struct TCmdChItem { typedef struct TCmdChItem {
char bCmd; BYTE bCmd;
BYTE bLoc; BYTE bLoc;
WORD wIndx; WORD wIndx;
WORD wCI; WORD wCI;
@ -812,40 +812,40 @@ typedef struct TCmdChItem {
} TCmdChItem; } TCmdChItem;
typedef struct TCmdDelItem { typedef struct TCmdDelItem {
char bCmd; BYTE bCmd;
BYTE bLoc; BYTE bLoc;
} TCmdDelItem; } TCmdDelItem;
typedef struct TCmdDamage { typedef struct TCmdDamage {
char bCmd; BYTE bCmd;
BYTE bPlr; BYTE bPlr;
DWORD dwDam; DWORD dwDam;
} TCmdDamage; } TCmdDamage;
typedef struct TCmdPlrInfoHdr { typedef struct TCmdPlrInfoHdr {
char bCmd; BYTE bCmd;
WORD wOffset; WORD wOffset;
WORD wBytes; WORD wBytes;
} TCmdPlrInfoHdr; } TCmdPlrInfoHdr;
typedef struct TCmdString { typedef struct TCmdString {
char bCmd; BYTE bCmd;
char str[MAX_SEND_STR_LEN]; char str[MAX_SEND_STR_LEN];
} TCmdString; } TCmdString;
typedef struct TFakeCmdPlr { typedef struct TFakeCmdPlr {
char bCmd; BYTE bCmd;
BYTE bPlr; BYTE bPlr;
} TFakeCmdPlr; } TFakeCmdPlr;
typedef struct TFakeDropPlr { typedef struct TFakeDropPlr {
char bCmd; BYTE bCmd;
BYTE bPlr; BYTE bPlr;
DWORD dwReason; DWORD dwReason;
} TFakeDropPlr; } TFakeDropPlr;
typedef struct TSyncHeader { typedef struct TSyncHeader {
char bCmd; BYTE bCmd;
BYTE bLevel; BYTE bLevel;
WORD wLen; WORD wLen;
BYTE bObjId; BYTE bObjId;
@ -907,7 +907,7 @@ typedef struct DMonsterStr {
} DMonsterStr; } DMonsterStr;
typedef struct DObjectStr { typedef struct DObjectStr {
char bCmd; BYTE bCmd;
} DObjectStr; } DObjectStr;
typedef struct DLevel { typedef struct DLevel {
@ -921,8 +921,8 @@ typedef struct LocalLevel {
} LocalLevel; } LocalLevel;
typedef struct DPortal { typedef struct DPortal {
char x; BYTE x;
char y; BYTE y;
BYTE level; BYTE level;
BYTE ltype; BYTE ltype;
BYTE setlvl; BYTE setlvl;
@ -962,7 +962,7 @@ typedef struct QuestStruct {
unsigned char _qmsg; unsigned char _qmsg;
unsigned char _qvar1; unsigned char _qvar1;
unsigned char _qvar2; unsigned char _qvar2;
int _qlog; /* char */ int _qlog;
} QuestStruct; } QuestStruct;
typedef struct QuestData { typedef struct QuestData {

Loading…
Cancel
Save