From 614ebe2e5c288547fac42a8b13614d87544ce798 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 27 Mar 2019 02:30:22 +0100 Subject: [PATCH 1/2] Make pack.cpp bin exact --- Source/pack.cpp | 75 ++++++++++++++++++++++--------------------------- structs.h | 42 +++++++++++++-------------- 2 files changed, 55 insertions(+), 62 deletions(-) diff --git a/Source/pack.cpp b/Source/pack.cpp index 45e0cb723..5cf1e2879 100644 --- a/Source/pack.cpp +++ b/Source/pack.cpp @@ -80,31 +80,24 @@ void __fastcall PackPlayer(PkPlayerStruct *pPack, int pnum, BOOL manashield) void __fastcall PackItem(PkItemStruct *id, ItemStruct *is) { - short v2; // ax - short v3; // bx - if (is->_itype == -1) { - id->idx = -1; + id->idx = 0xFFFF; } else { id->idx = is->IDidx; if (is->IDidx == IDI_EAR) { - _LOBYTE(v2) = 0; - _LOBYTE(v3) = 0; - _HIBYTE(v2) = is->_iName[7]; - id->iCreateInfo = is->_iName[8] | v2; + id->iCreateInfo = is->_iName[8] | (is->_iName[7] << 8); id->iSeed = is->_iName[12] | ((is->_iName[11] | ((is->_iName[10] | (is->_iName[9] << 8)) << 8)) << 8); id->bId = is->_iName[13]; id->bDur = is->_iName[14]; id->bMDur = is->_iName[15]; id->bCh = is->_iName[16]; id->bMCh = is->_iName[17]; - _HIBYTE(v3) = is->_iName[18]; - id->wValue = _LOWORD(is->_ivalue) | v3 | ((_LOWORD(is->_iCurs) - 19) << 6); + id->wValue = is->_ivalue | (is->_iName[18] << 8) | ((is->_iCurs - 19) << 6); id->dwBuff = is->_iName[22] | ((is->_iName[21] | ((is->_iName[20] | (is->_iName[19] << 8)) << 8)) << 8); } else { id->iSeed = is->_iSeed; id->iCreateInfo = is->_iCreateInfo; - id->bId = _LOBYTE(is->_iIdentified) + 2 * is->_iMagical; + id->bId = is->_iIdentified + 2 * is->_iMagical; id->bDur = is->_iDurability; id->bMDur = is->_iMaxDur; id->bCh = is->_iCharges; @@ -143,28 +136,28 @@ void __fastcall UnPackPlayer(PkPlayerStruct *pPack, int pnum, BOOL killok) pPlayer = &plr[pnum]; ClearPlrRVars(pPlayer); - pPlayer->WorldX = (unsigned char)pPack->px; - pPlayer->WorldY = (unsigned char)pPack->py; - pPlayer->_px = (unsigned char)pPack->px; - pPlayer->_py = (unsigned char)pPack->py; - pPlayer->_ptargx = (unsigned char)pPack->targx; - pPlayer->_ptargy = (unsigned char)pPack->targy; - pPlayer->plrlevel = (unsigned char)pPack->plrlevel; + pPlayer->WorldX = pPack->px; + pPlayer->WorldY = pPack->py; + pPlayer->_px = pPack->px; + pPlayer->_py = pPack->py; + pPlayer->_ptargx = pPack->targx; + pPlayer->_ptargy = pPack->targy; + pPlayer->plrlevel = pPack->plrlevel; ClrPlrPath(pnum); pPlayer->destAction = ACTION_NONE; strcpy(pPlayer->_pName, pPack->pName); pPlayer->_pClass = pPack->pClass; InitPlayer(pnum, TRUE); - pPlayer->_pBaseStr = (unsigned char)pPack->pBaseStr; - pPlayer->_pStrength = (unsigned char)pPack->pBaseStr; - pPlayer->_pBaseMag = (unsigned char)pPack->pBaseMag; - pPlayer->_pMagic = (unsigned char)pPack->pBaseMag; - pPlayer->_pBaseDex = (unsigned char)pPack->pBaseDex; - pPlayer->_pDexterity = (unsigned char)pPack->pBaseDex; - pPlayer->_pBaseVit = (unsigned char)pPack->pBaseVit; - pPlayer->_pVitality = (unsigned char)pPack->pBaseVit; + pPlayer->_pBaseStr = pPack->pBaseStr; + pPlayer->_pStrength = pPack->pBaseStr; + pPlayer->_pBaseMag = pPack->pBaseMag; + pPlayer->_pMagic = pPack->pBaseMag; + pPlayer->_pBaseDex = pPack->pBaseDex; + pPlayer->_pDexterity = pPack->pBaseDex; + pPlayer->_pBaseVit = pPack->pBaseVit; + pPlayer->_pVitality = pPack->pBaseVit; pPlayer->_pLevel = pPack->pLevel; - pPlayer->_pStatPts = (unsigned char)pPack->pStatPts; + pPlayer->_pStatPts = pPack->pStatPts; pPlayer->_pExperience = pPack->pExperience; pPlayer->_pGold = pPack->pGold; pPlayer->_pMaxHPBase = pPack->pMaxHPBase; @@ -201,7 +194,7 @@ void __fastcall UnPackPlayer(PkPlayerStruct *pPack, int pnum, BOOL killok) for (i = 0; i < 40; i++) pPlayer->InvGrid[i] = pPack->InvGrid[i]; - pPlayer->_pNumInv = (unsigned char)pPack->_pNumInv; + pPlayer->_pNumInv = pPack->_pNumInv; VerifyGoldSeeds(pPlayer); pki = pPack->SpdList; @@ -231,7 +224,7 @@ void __fastcall UnPackPlayer(PkPlayerStruct *pPack, int pnum, BOOL killok) // find real name reference below, possibly [sizeof(item[])/sizeof(ItemStruct)] void __fastcall UnPackItem(PkItemStruct *is, ItemStruct *id) { - if (is->idx == -1) { + if (is->idx == 0xFFFF) { id->_itype = -1; } else { if (is->idx == IDI_EAR) { @@ -239,21 +232,21 @@ void __fastcall UnPackItem(PkItemStruct *is, ItemStruct *id) MAXITEMS, is->iCreateInfo, is->iSeed, - (unsigned char)is->bId, - (unsigned char)is->bDur, - (unsigned char)is->bMDur, - (unsigned char)is->bCh, - (unsigned char)is->bMCh, - (unsigned short)is->wValue, + is->bId, + is->bDur, + is->bMDur, + is->bCh, + is->bMCh, + is->wValue, is->dwBuff); } else { - RecreateItem(MAXITEMS, (unsigned short)is->idx, is->iCreateInfo, is->iSeed, (unsigned short)is->wValue); - item[MAXITEMS]._iMagical = (unsigned char)is->bId >> 1; + RecreateItem(MAXITEMS, is->idx, is->iCreateInfo, is->iSeed, is->wValue); + item[MAXITEMS]._iMagical = is->bId >> 1; item[MAXITEMS]._iIdentified = is->bId & 1; - item[MAXITEMS]._iDurability = (unsigned char)is->bDur; - item[MAXITEMS]._iMaxDur = (unsigned char)is->bMDur; - item[MAXITEMS]._iCharges = (unsigned char)is->bCh; - item[MAXITEMS]._iMaxCharges = (unsigned char)is->bMCh; + item[MAXITEMS]._iDurability = is->bDur; + item[MAXITEMS]._iMaxDur = is->bMDur; + item[MAXITEMS]._iCharges = is->bCh; + item[MAXITEMS]._iMaxCharges = is->bMCh; } *id = item[MAXITEMS]; } diff --git a/structs.h b/structs.h index 24bb786b2..5cc6132e8 100644 --- a/structs.h +++ b/structs.h @@ -1346,16 +1346,16 @@ typedef struct _SNETVERSIONDATA { #pragma pack(push, 1) typedef struct PkItemStruct { - int iSeed; - short iCreateInfo; - short idx; - char bId; - char bDur; - char bMDur; - char bCh; - char bMCh; - short wValue; - int dwBuff; + DWORD iSeed; + WORD iCreateInfo; + WORD idx; + BYTE bId; + BYTE bDur; + BYTE bMDur; + BYTE bCh; + BYTE bMCh; + WORD wValue; + DWORD dwBuff; } PkItemStruct; typedef struct PkPlayerStruct { @@ -1363,19 +1363,19 @@ typedef struct PkPlayerStruct { char destAction; char destParam1; char destParam2; - char plrlevel; - char px; - char py; - char targx; - char targy; + BYTE plrlevel; + BYTE px; + BYTE py; + BYTE targx; + BYTE targy; char pName[32]; char pClass; - char pBaseStr; - char pBaseMag; - char pBaseDex; - char pBaseVit; + BYTE pBaseStr; + BYTE pBaseMag; + BYTE pBaseDex; + BYTE pBaseVit; char pLevel; - char pStatPts; + BYTE pStatPts; int pExperience; int pGold; int pHPBase; @@ -1387,7 +1387,7 @@ typedef struct PkPlayerStruct { PkItemStruct InvBody[7]; PkItemStruct InvList[40]; char InvGrid[40]; - char _pNumInv; + BYTE _pNumInv; PkItemStruct SpdList[MAXBELTITEMS]; char pTownWarps; char pDungMsgs; From 4c497e1775493996a9384854ca3a606ac6c4fb7a Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 27 Mar 2019 17:46:06 +0100 Subject: [PATCH 2/2] Use values from defs.h --- Source/pack.cpp | 22 ++++++++++------------ structs.h | 10 +++++----- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/Source/pack.cpp b/Source/pack.cpp index 5cf1e2879..ebb1d6d2e 100644 --- a/Source/pack.cpp +++ b/Source/pack.cpp @@ -4,12 +4,12 @@ void __fastcall PackPlayer(PkPlayerStruct *pPack, int pnum, BOOL manashield) { - PlayerStruct *pPlayer; // edi - int i; // [esp+8h] [ebp-Ch] - ItemStruct *pi; // [esp+Ch] [ebp-8h] - PkItemStruct *pki; // [esp+10h] [ebp-4h] + PlayerStruct *pPlayer; + int i; + ItemStruct *pi; + PkItemStruct *pki; - memset(pPack, 0, 0x4F2); + memset(pPack, 0, sizeof(*pPack)); pPlayer = &plr[pnum]; pPack->destAction = pPlayer->destAction; pPack->destParam1 = pPlayer->destParam1; @@ -50,13 +50,13 @@ void __fastcall PackPlayer(PkPlayerStruct *pPack, int pnum, BOOL manashield) pki = pPack->InvList; pi = pPlayer->InvList; - for (i = 0; i < 40; i++) { + for (i = 0; i < NUM_INV_GRID_ELEM; i++) { PackItem(pki, pi); pki++; pi++; } - for (i = 0; i < 40; i++) + for (i = 0; i < NUM_INV_GRID_ELEM; i++) pPack->InvGrid[i] = pPlayer->InvGrid[i]; pPack->_pNumInv = pPlayer->_pNumInv; @@ -76,7 +76,6 @@ void __fastcall PackPlayer(PkPlayerStruct *pPack, int pnum, BOOL manashield) else pPack->pManaShield = FALSE; } -// 679660: using guessed type char gbMaxPlayers; void __fastcall PackItem(PkItemStruct *id, ItemStruct *is) { @@ -110,8 +109,7 @@ void __fastcall PackItem(PkItemStruct *id, ItemStruct *is) void __fastcall VerifyGoldSeeds(PlayerStruct *pPlayer) { - int i; // ebp - int j; // ecx + int i, j; for (i = 0; i < pPlayer->_pNumInv; i++) { if (pPlayer->InvList[i].IDidx == IDI_GOLD && pPlayer->_pNumInv > 0) { @@ -185,13 +183,13 @@ void __fastcall UnPackPlayer(PkPlayerStruct *pPack, int pnum, BOOL killok) pki = pPack->InvList; pi = pPlayer->InvList; - for (i = 0; i < 40; i++) { + for (i = 0; i < NUM_INV_GRID_ELEM; i++) { UnPackItem(pki, pi); pki++; pi++; } - for (i = 0; i < 40; i++) + for (i = 0; i < NUM_INV_GRID_ELEM; i++) pPlayer->InvGrid[i] = pPack->InvGrid[i]; pPlayer->_pNumInv = pPack->_pNumInv; diff --git a/structs.h b/structs.h index 5cc6132e8..1d60c53b5 100644 --- a/structs.h +++ b/structs.h @@ -217,7 +217,7 @@ typedef struct PlayerStruct { unsigned char _pInvincible; char _pLightRad; unsigned char _pLvlChanging; - char _pName[32]; + char _pName[PLR_NAME_LEN]; // plr_class enum value. // TODO: this could very well be `enum plr_class _pClass` // since there are 3 bytes of alingment after this field. @@ -1061,7 +1061,7 @@ typedef struct TownerStruct { int _tVar2; int _tVar3; int _tVar4; - char _tName[32]; + char _tName[PLR_NAME_LEN]; unsigned char *_tNAnim[8]; int _tNFrames; unsigned char *_tNData; @@ -1368,7 +1368,7 @@ typedef struct PkPlayerStruct { BYTE py; BYTE targx; BYTE targy; - char pName[32]; + char pName[PLR_NAME_LEN]; char pClass; BYTE pBaseStr; BYTE pBaseMag; @@ -1385,8 +1385,8 @@ typedef struct PkPlayerStruct { char pSplLvl[MAX_SPELLS]; unsigned __int64 pMemSpells; PkItemStruct InvBody[7]; - PkItemStruct InvList[40]; - char InvGrid[40]; + PkItemStruct InvList[NUM_INV_GRID_ELEM]; + char InvGrid[NUM_INV_GRID_ELEM]; BYTE _pNumInv; PkItemStruct SpdList[MAXBELTITEMS]; char pTownWarps;