From 049178cb2eec0d2828bca972c4e330942cfd1a79 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sun, 22 Sep 2019 01:27:26 +0200 Subject: [PATCH] Clean up load/save code Remove most call to memcpy in preperation for Big Endian support Document what pointers are being skipped Align save and load code (easier to verify that both are correct) --- Source/loadsave.cpp | 446 +++++++++++++++++++--------------- Source/loadsave.h | 4 +- SourceX/DiabloUI/diabloui.cpp | 32 +-- structs.h | 6 - 4 files changed, 266 insertions(+), 222 deletions(-) diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index b9536bba8..d758e74ce 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -207,46 +207,40 @@ BOOL OLoad() return FALSE; } -void CopyInt(const void *src, void *dst) +void CopyBytes(const void *src, const int n, void *dst) { - memcpy(dst, src, 4); - tbuff += 4; + memcpy(dst, src, n); + tbuff += n; } -void CopyShort(const void *src, void *dst) +void CopyChar(const void *src, void *dst) { - memcpy(dst, src, 2); - tbuff += 2; + CopyBytes(src, 1, dst); } -void CopyShorts(const void *src, const int n, void *dst) +void CopyShort(const void *src, void *dst) { - memcpy(dst, src, 2 * n); - tbuff += 2 * n; + CopyBytes(src, 2, dst); } -void CopyInts(const void *src, const int n, void *dst) +void CopyShorts(const void *src, const int n, void *dst) { - memcpy(dst, src, 4 * n); - tbuff += 4 * n; + CopyBytes(src, 2 * n, dst); } -void CopyBytes(const void *src, const int n, void *dst) +void CopyInt(const void *src, void *dst) { - memcpy(dst, src, n); - tbuff += n; + CopyBytes(src, 4, dst); } -void CopyChar(const void *src, void *dst) +void CopyInts(const void *src, const int n, void *dst) { - memcpy(dst, src, 1); - tbuff += 1; + CopyBytes(src, 4 * n, dst); } void CopyInt64(const void *src, void *dst) { - memcpy(dst, src, 8); - tbuff += 8; + CopyBytes(src, 8, dst); } void LoadPlayer(int i) @@ -254,11 +248,9 @@ void LoadPlayer(int i) PlayerStruct *pPlayer = &plr[i]; CopyInt(tbuff, &pPlayer->_pmode); - CopyBytes(tbuff, 25, pPlayer->walkpath); CopyBytes(tbuff, 1, &pPlayer->plractive); - tbuff += 2; - + tbuff += 2; // Alignment CopyInt(tbuff, &pPlayer->destAction); CopyInt(tbuff, &pPlayer->destParam1); CopyInt(tbuff, &pPlayer->destParam2); @@ -282,7 +274,7 @@ void LoadPlayer(int i) CopyInt(tbuff, &pPlayer->_pdir); CopyInt(tbuff, &pPlayer->_nextdir); CopyInt(tbuff, &pPlayer->_pgfxnum); - tbuff += 4; // Skip pointers + tbuff += 4; // Skip pointer _pAnimData CopyInt(tbuff, &pPlayer->_pAnimDelay); CopyInt(tbuff, &pPlayer->_pAnimCnt); CopyInt(tbuff, &pPlayer->_pAnimLen); @@ -296,33 +288,34 @@ void LoadPlayer(int i) CopyInt(tbuff, &pPlayer->_pSpell); CopyChar(tbuff, &pPlayer->_pSplType); CopyChar(tbuff, &pPlayer->_pSplFrom); - tbuff += 2; + tbuff += 2; // Alignment CopyInt(tbuff, &pPlayer->_pTSpell); CopyChar(tbuff, &pPlayer->_pTSplType); - tbuff += 3; + tbuff += 3; // Alignment CopyInt(tbuff, &pPlayer->_pRSpell); CopyChar(tbuff, &pPlayer->_pRSplType); - tbuff += 3; + tbuff += 3; // Alignment CopyInt(tbuff, &pPlayer->_pSBkSpell); CopyChar(tbuff, &pPlayer->_pSBkSplType); - CopyBytes(tbuff, 64, &pPlayer->_pSplLvl); - tbuff += 7; + tbuff += 7; // Alignment CopyInt64(tbuff, &pPlayer->_pMemSpells); CopyInt64(tbuff, &pPlayer->_pAblSpells); CopyInt64(tbuff, &pPlayer->_pScrlSpells); CopyChar(tbuff, &pPlayer->_pSpellFlags); - tbuff += 3; + tbuff += 3; // Alignment CopyInts(tbuff, 4, &pPlayer->_pSplHotKey); CopyBytes(tbuff, 4, &pPlayer->_pSplTHotKey); + CopyInt(tbuff, &pPlayer->_pwtype); CopyChar(tbuff, &pPlayer->_pBlockFlag); CopyChar(tbuff, &pPlayer->_pInvincible); CopyChar(tbuff, &pPlayer->_pLightRad); CopyChar(tbuff, &pPlayer->_pLvlChanging); + CopyBytes(tbuff, PLR_NAME_LEN, &pPlayer->_pName); CopyChar(tbuff, &pPlayer->_pClass); - tbuff += 3; + tbuff += 3; // Alignment CopyInt(tbuff, &pPlayer->_pStrength); CopyInt(tbuff, &pPlayer->_pBaseStr); CopyInt(tbuff, &pPlayer->_pMagic); @@ -346,7 +339,7 @@ void LoadPlayer(int i) CopyInt(tbuff, &pPlayer->_pManaPer); CopyChar(tbuff, &pPlayer->_pLevel); CopyChar(tbuff, &pPlayer->_pMaxLvl); - tbuff += 2; + tbuff += 2; // Alignment CopyInt(tbuff, &pPlayer->_pExperience); CopyInt(tbuff, &pPlayer->_pMaxExp); CopyInt(tbuff, &pPlayer->_pNextExper); @@ -355,6 +348,7 @@ void LoadPlayer(int i) CopyChar(tbuff, &pPlayer->_pFireResist); CopyChar(tbuff, &pPlayer->_pLghtResist); CopyInt(tbuff, &pPlayer->_pGold); + CopyInt(tbuff, &pPlayer->_pInfraFlag); CopyInt(tbuff, &pPlayer->_pVar1); CopyInt(tbuff, &pPlayer->_pVar2); @@ -366,50 +360,42 @@ void LoadPlayer(int i) CopyInt(tbuff, &pPlayer->_pVar8); CopyBytes(tbuff, NUMLEVELS, &pPlayer->_pLvlVisited); CopyBytes(tbuff, NUMLEVELS, &pPlayer->_pSLvlVisited); - tbuff += 2; - CopyInt(tbuff, &pPlayer->_pGFXLoad); + tbuff += 2; // Alignment - tbuff += sizeof(DWORD) * 8; + CopyInt(tbuff, &pPlayer->_pGFXLoad); + tbuff += 4 * 8; // Skip pointers _pNAnim CopyInt(tbuff, &pPlayer->_pNFrames); CopyInt(tbuff, &pPlayer->_pNWidth); - - tbuff += sizeof(DWORD) * 8; - + tbuff += 4 * 8; // Skip pointers _pWAnim CopyInt(tbuff, &pPlayer->_pWFrames); CopyInt(tbuff, &pPlayer->_pWWidth); - - tbuff += sizeof(DWORD) * 8; - + tbuff += 4 * 8; // Skip pointers _pAAnim CopyInt(tbuff, &pPlayer->_pAFrames); CopyInt(tbuff, &pPlayer->_pAWidth); CopyInt(tbuff, &pPlayer->_pAFNum); - - tbuff += sizeof(DWORD) * 24; - + tbuff += 4 * 8; // Skip pointers _pLAnim + tbuff += 4 * 8; // Skip pointers _pFAnim + tbuff += 4 * 8; // Skip pointers _pTAnim CopyInt(tbuff, &pPlayer->_pSFrames); CopyInt(tbuff, &pPlayer->_pSWidth); CopyInt(tbuff, &pPlayer->_pSFNum); - - tbuff += sizeof(DWORD) * 8; - + tbuff += 4 * 8; // Skip pointers _pHAnim CopyInt(tbuff, &pPlayer->_pHFrames); CopyInt(tbuff, &pPlayer->_pHWidth); - - tbuff += sizeof(DWORD) * 8; - + tbuff += 4 * 8; // Skip pointers _pDAnim CopyInt(tbuff, &pPlayer->_pDFrames); CopyInt(tbuff, &pPlayer->_pDWidth); - - tbuff += sizeof(DWORD) * 8; - + tbuff += 4 * 8; // Skip pointers _pBAnim CopyInt(tbuff, &pPlayer->_pBFrames); CopyInt(tbuff, &pPlayer->_pBWidth); - CopyItems(NUM_INVLOC, pPlayer->InvBody); - CopyItems(NUM_INV_GRID_ELEM, pPlayer->InvList); + + LoadItems(NUM_INVLOC, pPlayer->InvBody); + LoadItems(NUM_INV_GRID_ELEM, pPlayer->InvList); CopyInt(tbuff, &pPlayer->_pNumInv); CopyBytes(tbuff, NUM_INV_GRID_ELEM, pPlayer->InvGrid); - CopyItems(MAXBELTITEMS, pPlayer->SpdList); - CopyItem(&pPlayer->HoldItem); + LoadItems(MAXBELTITEMS, pPlayer->SpdList); + LoadItemData(&pPlayer->HoldItem); + CopyInt(tbuff, &pPlayer->_pIMinDam); CopyInt(tbuff, &pPlayer->_pIMaxDam); CopyInt(tbuff, &pPlayer->_pIAC); @@ -417,15 +403,14 @@ void LoadPlayer(int i) CopyInt(tbuff, &pPlayer->_pIBonusToHit); CopyInt(tbuff, &pPlayer->_pIBonusAC); CopyInt(tbuff, &pPlayer->_pIBonusDamMod); - tbuff += 4; + tbuff += 4; // Alignment + CopyInt64(tbuff, &pPlayer->_pISpells); CopyInt(tbuff, &pPlayer->_pIFlags); CopyInt(tbuff, &pPlayer->_pIGetHit); - CopyChar(tbuff, &pPlayer->_pISplLvlAdd); CopyChar(tbuff, &pPlayer->_pISplCost); - tbuff += 2; - + tbuff += 2; // Alignment CopyInt(tbuff, &pPlayer->_pISplDur); CopyInt(tbuff, &pPlayer->_pIEnAc); CopyInt(tbuff, &pPlayer->_pIFMinDam); @@ -433,21 +418,27 @@ void LoadPlayer(int i) CopyInt(tbuff, &pPlayer->_pILMinDam); CopyInt(tbuff, &pPlayer->_pILMaxDam); CopyInt(tbuff, &pPlayer->_pOilType); - CopyChar(tbuff, &pPlayer->pTownWarps); CopyChar(tbuff, &pPlayer->pDungMsgs); CopyChar(tbuff, &pPlayer->pLvlLoad); CopyChar(tbuff, &pPlayer->pBattleNet); - CopyChar(tbuff, &pPlayer->pManaShield); CopyBytes(tbuff, 3, &pPlayer->bReserved); - CopyShorts(tbuff, 8, &pPlayer->wReserved); CopyInt(tbuff, &pPlayer->pDiabloKillLevel); CopyInts(tbuff, 7, &pPlayer->dwReserved); - // Omit 10 pointers + // Omit pointer _pNData + // Omit pointer _pWData + // Omit pointer _pAData + // Omit pointer _pLData + // Omit pointer _pFData + // Omit pointer _pTData + // Omit pointer _pHData + // Omit pointer _pDData + // Omit pointer _pBData + // Omit pointer pReserved } void LoadMonster(int i) @@ -456,18 +447,14 @@ void LoadMonster(int i) CopyInt(tbuff, &pMonster->_mMTidx); CopyInt(tbuff, &pMonster->_mmode); - CopyChar(tbuff, &pMonster->_mgoal); - tbuff += 3; - + tbuff += 3; // Alignment CopyInt(tbuff, &pMonster->_mgoalvar1); CopyInt(tbuff, &pMonster->_mgoalvar2); CopyInt(tbuff, &pMonster->_mgoalvar3); CopyInt(tbuff, &pMonster->field_18); - CopyChar(tbuff, &pMonster->_pathcount); - tbuff += 3; - + tbuff += 3; // Alignment CopyInt(tbuff, &pMonster->_mx); CopyInt(tbuff, &pMonster->_my); CopyInt(tbuff, &pMonster->_mfutx); @@ -480,12 +467,11 @@ void LoadMonster(int i) CopyInt(tbuff, &pMonster->_myvel); CopyInt(tbuff, &pMonster->_mdir); CopyInt(tbuff, &pMonster->_menemy); - CopyChar(tbuff, &pMonster->_menemyx); CopyChar(tbuff, &pMonster->_menemyy); CopyShort(tbuff, &pMonster->falign_52); - tbuff += 4; // Skip pointer + tbuff += 4; // Skip pointer _mAnimData CopyInt(tbuff, &pMonster->_mAnimDelay); CopyInt(tbuff, &pMonster->_mAnimCnt); CopyInt(tbuff, &pMonster->_mAnimLen); @@ -506,12 +492,9 @@ void LoadMonster(int i) CopyChar(tbuff, &pMonster->_mAi); CopyChar(tbuff, &pMonster->_mint); CopyShort(tbuff, &pMonster->falign_9A); - CopyInt(tbuff, &pMonster->_mFlags); - CopyChar(tbuff, &pMonster->_msquelch); - tbuff += 3; - + tbuff += 3; // Alignment CopyInt(tbuff, &pMonster->falign_A4); CopyInt(tbuff, &pMonster->_lastx); CopyInt(tbuff, &pMonster->_lasty); @@ -522,31 +505,29 @@ void LoadMonster(int i) CopyChar(tbuff, &pMonster->_uniqtype); CopyChar(tbuff, &pMonster->_uniqtrans); CopyChar(tbuff, &pMonster->_udeadval); - CopyChar(tbuff, &pMonster->mWhoHit); + CopyChar(tbuff, &pMonster->mWhoHit); CopyChar(tbuff, &pMonster->mLevel); - tbuff += 1; + tbuff += 1; // Alignment CopyShort(tbuff, &pMonster->mExp); CopyChar(tbuff, &pMonster->mHit); CopyChar(tbuff, &pMonster->mMinDamage); CopyChar(tbuff, &pMonster->mMaxDamage); CopyChar(tbuff, &pMonster->mHit2); - CopyChar(tbuff, &pMonster->mMinDamage2); CopyChar(tbuff, &pMonster->mMaxDamage2); CopyChar(tbuff, &pMonster->mArmorClass); CopyChar(tbuff, &pMonster->falign_CB); - CopyShort(tbuff, &pMonster->mMagicRes); - tbuff += 2; + tbuff += 2; // Alignment CopyInt(tbuff, &pMonster->mtalkmsg); - CopyChar(tbuff, &pMonster->leader); CopyChar(tbuff, &pMonster->leaderflag); CopyChar(tbuff, &pMonster->packsize); CopyChar(tbuff, &pMonster->mlid); + // Omit pointer mName; // Omit pointer MType; // Omit pointer MData; @@ -573,10 +554,9 @@ void LoadMissile(int i) CopyInt(tbuff, &pMissile->_mispllvl); CopyInt(tbuff, &pMissile->_miDelFlag); CopyChar(tbuff, &pMissile->_miAnimType); - tbuff += 3; - + tbuff += 3; // Alignment CopyInt(tbuff, &pMissile->_miAnimFlags); - tbuff += 4; + tbuff += 4; // Skip pointer _miAnimData CopyInt(tbuff, &pMissile->_miAnimDelay); CopyInt(tbuff, &pMissile->_miAnimLen); CopyInt(tbuff, &pMissile->_miAnimWidth); @@ -609,12 +589,13 @@ void LoadMissile(int i) void LoadObject(int i) { ObjectStruct *pObject = &object[i]; + CopyInt(tbuff, &pObject->_otype); CopyInt(tbuff, &pObject->_ox); CopyInt(tbuff, &pObject->_oy); CopyInt(tbuff, &pObject->_oLight); CopyInt(tbuff, &pObject->_oAnimFlag); - tbuff += 4; + tbuff += 4; // Skip pointer _oAnimData CopyInt(tbuff, &pObject->_oAnimDelay); CopyInt(tbuff, &pObject->_oAnimCnt); CopyInt(tbuff, &pObject->_oAnimLen); @@ -622,16 +603,13 @@ void LoadObject(int i) CopyInt(tbuff, &pObject->_oAnimWidth); CopyInt(tbuff, &pObject->_oAnimWidth2); CopyInt(tbuff, &pObject->_oDelFlag); - CopyChar(tbuff, &pObject->_oBreak); - tbuff += 3; - + tbuff += 3; // Alignment CopyInt(tbuff, &pObject->_oSolidFlag); CopyInt(tbuff, &pObject->_oMissFlag); CopyChar(tbuff, &pObject->_oSelFlag); - tbuff += 3; - + tbuff += 3; // Alignment CopyInt(tbuff, &pObject->_oPreFlag); CopyInt(tbuff, &pObject->_oTrapFlag); CopyInt(tbuff, &pObject->_oDoorFlag); @@ -649,15 +627,15 @@ void LoadObject(int i) void LoadItem(int i) { - CopyItem(&item[i]); + LoadItemData(&item[i]); GetItemFrm(i); } -void CopyItem(ItemStruct *pItem) +void LoadItemData(ItemStruct *pItem) { CopyInt(tbuff, &pItem->_iSeed); CopyShort(tbuff, &pItem->_iCreateInfo); - tbuff += 2; + tbuff += 2; // Alignment CopyInt(tbuff, &pItem->_itype); CopyInt(tbuff, &pItem->_ix); CopyInt(tbuff, &pItem->_iy); @@ -669,7 +647,7 @@ void CopyItem(ItemStruct *pItem) CopyInt(tbuff, &pItem->_iAnimWidth2); CopyInt(tbuff, &pItem->_isin); CopyChar(tbuff, &pItem->_iSelFlag); - tbuff += 3; + tbuff += 3; // Alignment CopyInt(tbuff, &pItem->_iPostDraw); CopyInt(tbuff, &pItem->_iIdentified); CopyChar(tbuff, &pItem->_iMagical); @@ -677,7 +655,7 @@ void CopyItem(ItemStruct *pItem) CopyBytes(tbuff, 64, &pItem->_iIName); CopyChar(tbuff, &pItem->_iLoc); CopyChar(tbuff, &pItem->_iClass); - tbuff += 1; + tbuff += 1; // Alignment CopyInt(tbuff, &pItem->_iCurs); CopyInt(tbuff, &pItem->_ivalue); CopyInt(tbuff, &pItem->_iIvalue); @@ -708,7 +686,7 @@ void CopyItem(ItemStruct *pItem) CopyInt(tbuff, &pItem->_iPLLight); CopyChar(tbuff, &pItem->_iSplLvlAdd); CopyChar(tbuff, &pItem->_iRequest); - tbuff += 2; + tbuff += 2; // Alignment CopyInt(tbuff, &pItem->_iUid); CopyInt(tbuff, &pItem->_iFMinDam); CopyInt(tbuff, &pItem->_iFMaxDam); @@ -717,7 +695,7 @@ void CopyItem(ItemStruct *pItem) CopyInt(tbuff, &pItem->_iPLEnAc); CopyChar(tbuff, &pItem->_iPrePower); CopyChar(tbuff, &pItem->_iSufPower); - tbuff += 2; + tbuff += 2; // Alignment CopyInt(tbuff, &pItem->_iVAdd1); CopyInt(tbuff, &pItem->_iVMult1); CopyInt(tbuff, &pItem->_iVAdd2); @@ -725,28 +703,42 @@ void CopyItem(ItemStruct *pItem) CopyChar(tbuff, &pItem->_iMinStr); CopyChar(tbuff, &pItem->_iMinMag); CopyChar(tbuff, &pItem->_iMinDex); - tbuff += 1; + tbuff += 1; // Alignment CopyInt(tbuff, &pItem->_iStatFlag); CopyInt(tbuff, &pItem->IDidx); CopyInt(tbuff, &pItem->offs016C); } -void CopyItems(const int n, ItemStruct *pItem) +void LoadItems(const int n, ItemStruct *pItem) { for (int i = 0; i < n; i++) { - CopyItem(&pItem[i]); + LoadItemData(&pItem[i]); } } void LoadPremium(int i) { - CopyItem(&premiumitem[i]); + LoadItemData(&premiumitem[i]); } void LoadQuest(int i) { - memcpy(&quests[i], tbuff, sizeof(*quests)); - tbuff += sizeof(*quests); + QuestStruct *pQuest = &quests[i]; + + CopyChar(tbuff, &pQuest->_qlevel); + CopyChar(tbuff, &pQuest->_qtype); + CopyChar(tbuff, &pQuest->_qactive); + CopyChar(tbuff, &pQuest->_qlvltype); + CopyInt(tbuff, &pQuest->_qtx); + CopyInt(tbuff, &pQuest->_qty); + CopyChar(tbuff, &pQuest->_qslvl); + CopyChar(tbuff, &pQuest->_qidx); + CopyChar(tbuff, &pQuest->_qmsg); + CopyChar(tbuff, &pQuest->_qvar1); + CopyChar(tbuff, &pQuest->_qvar2); + tbuff += 3; // Alignment + CopyInt(tbuff, &pQuest->_qlog); + ReturnLvlX = WLoad(); ReturnLvlY = WLoad(); ReturnLvl = WLoad(); @@ -756,20 +748,52 @@ void LoadQuest(int i) void LoadLighting(int i) { - memcpy(&LightList[i], tbuff, sizeof(*LightList)); - tbuff += sizeof(*LightList); + LightListStruct *pLight = &LightList[i]; + + CopyInt(tbuff, &pLight->_lx); + CopyInt(tbuff, &pLight->_ly); + CopyInt(tbuff, &pLight->_lradius); + CopyInt(tbuff, &pLight->_lid); + CopyInt(tbuff, &pLight->_ldel); + CopyInt(tbuff, &pLight->_lunflag); + CopyInt(tbuff, &pLight->field_18); + CopyInt(tbuff, &pLight->_lunx); + CopyInt(tbuff, &pLight->_luny); + CopyInt(tbuff, &pLight->_lunr); + CopyInt(tbuff, &pLight->_xoff); + CopyInt(tbuff, &pLight->_yoff); + CopyInt(tbuff, &pLight->_lflags); } void LoadVision(int i) { - memcpy(&VisionList[i], tbuff, sizeof(*VisionList)); - tbuff += sizeof(*VisionList); + LightListStruct *pVision = &VisionList[i]; + + CopyInt(tbuff, &pVision->_lx); + CopyInt(tbuff, &pVision->_ly); + CopyInt(tbuff, &pVision->_lradius); + CopyInt(tbuff, &pVision->_lid); + CopyInt(tbuff, &pVision->_ldel); + CopyInt(tbuff, &pVision->_lunflag); + CopyInt(tbuff, &pVision->field_18); + CopyInt(tbuff, &pVision->_lunx); + CopyInt(tbuff, &pVision->_luny); + CopyInt(tbuff, &pVision->_lunr); + CopyInt(tbuff, &pVision->_xoff); + CopyInt(tbuff, &pVision->_yoff); + CopyInt(tbuff, &pVision->_lflags); } void LoadPortal(int i) { - memcpy(&portal[i], tbuff, sizeof(*portal)); - tbuff += sizeof(*portal); + PortalStruct *pPortal = &portal[i]; + + CopyInt(tbuff, &pPortal->open); + CopyInt(tbuff, &pPortal->x); + CopyInt(tbuff, &pPortal->y); + CopyInt(tbuff, &pPortal->level); + CopyInt(tbuff, &pPortal->ltype); + CopyInt(tbuff, &pPortal->setlvl); } void SaveGame() @@ -944,18 +968,14 @@ void OSave(BOOL v) *tbuff++ = FALSE; } - - void SavePlayer(int i) { PlayerStruct *pPlayer = &plr[i]; CopyInt(&pPlayer->_pmode, tbuff); - CopyBytes(&pPlayer->walkpath, 25, tbuff); CopyBytes(&pPlayer->plractive, 1, tbuff); - tbuff += 2; - + tbuff += 2; // Alignment CopyInt(&pPlayer->destAction, tbuff); CopyInt(&pPlayer->destParam1, tbuff); CopyInt(&pPlayer->destParam2, tbuff); @@ -979,7 +999,7 @@ void SavePlayer(int i) CopyInt(&pPlayer->_pdir, tbuff); CopyInt(&pPlayer->_nextdir, tbuff); CopyInt(&pPlayer->_pgfxnum, tbuff); - tbuff += 4; // Skip pointers + tbuff += 4; // Skip pointer _pAnimData CopyInt(&pPlayer->_pAnimDelay, tbuff); CopyInt(&pPlayer->_pAnimCnt, tbuff); CopyInt(&pPlayer->_pAnimLen, tbuff); @@ -991,37 +1011,36 @@ void SavePlayer(int i) CopyInt(&pPlayer->_pvid, tbuff); CopyInt(&pPlayer->_pSpell, tbuff); - CopyChar(&pPlayer->_pSplType, tbuff); CopyChar(&pPlayer->_pSplFrom, tbuff); - tbuff += 2; - + tbuff += 2; // Alignment CopyInt(&pPlayer->_pTSpell, tbuff); CopyChar(&pPlayer->_pTSplType, tbuff); - tbuff += 3; + tbuff += 3; // Alignment CopyInt(&pPlayer->_pRSpell, tbuff); CopyChar(&pPlayer->_pRSplType, tbuff); - tbuff += 3; + tbuff += 3; // Alignment CopyInt(&pPlayer->_pSBkSpell, tbuff); CopyChar(&pPlayer->_pSBkSplType, tbuff); - CopyBytes(&pPlayer->_pSplLvl, 64, tbuff); - tbuff += 7; + tbuff += 7; // Alignment CopyInt64(&pPlayer->_pMemSpells, tbuff); CopyInt64(&pPlayer->_pAblSpells, tbuff); CopyInt64(&pPlayer->_pScrlSpells, tbuff); CopyChar(&pPlayer->_pSpellFlags, tbuff); - tbuff += 3; + tbuff += 3; // Alignment CopyInts(&pPlayer->_pSplHotKey, 4, tbuff); CopyBytes(&pPlayer->_pSplTHotKey, 4, tbuff); + CopyInt(&pPlayer->_pwtype, tbuff); CopyChar(&pPlayer->_pBlockFlag, tbuff); CopyChar(&pPlayer->_pInvincible, tbuff); CopyChar(&pPlayer->_pLightRad, tbuff); CopyChar(&pPlayer->_pLvlChanging, tbuff); + CopyBytes(&pPlayer->_pName, PLR_NAME_LEN, tbuff); CopyChar(&pPlayer->_pClass, tbuff); - tbuff += 3; + tbuff += 3; // Alignment CopyInt(&pPlayer->_pStrength, tbuff); CopyInt(&pPlayer->_pBaseStr, tbuff); CopyInt(&pPlayer->_pMagic, tbuff); @@ -1045,7 +1064,7 @@ void SavePlayer(int i) CopyInt(&pPlayer->_pManaPer, tbuff); CopyChar(&pPlayer->_pLevel, tbuff); CopyChar(&pPlayer->_pMaxLvl, tbuff); - tbuff += 2; + tbuff += 2; // Alignment CopyInt(&pPlayer->_pExperience, tbuff); CopyInt(&pPlayer->_pMaxExp, tbuff); CopyInt(&pPlayer->_pNextExper, tbuff); @@ -1054,6 +1073,7 @@ void SavePlayer(int i) CopyChar(&pPlayer->_pFireResist, tbuff); CopyChar(&pPlayer->_pLghtResist, tbuff); CopyInt(&pPlayer->_pGold, tbuff); + CopyInt(&pPlayer->_pInfraFlag, tbuff); CopyInt(&pPlayer->_pVar1, tbuff); CopyInt(&pPlayer->_pVar2, tbuff); @@ -1065,50 +1085,42 @@ void SavePlayer(int i) CopyInt(&pPlayer->_pVar8, tbuff); CopyBytes(&pPlayer->_pLvlVisited, NUMLEVELS, tbuff); CopyBytes(&pPlayer->_pSLvlVisited, NUMLEVELS, tbuff); // only 10 used - tbuff += 2; - CopyInt(&pPlayer->_pGFXLoad, tbuff); + tbuff += 2; // Alignment - tbuff += sizeof(DWORD) * 8; // Skip 8 pointers + CopyInt(&pPlayer->_pGFXLoad, tbuff); + tbuff += 4 * 8; // Skip pointers _pNAnim CopyInt(&pPlayer->_pNFrames, tbuff); CopyInt(&pPlayer->_pNWidth, tbuff); - - tbuff += sizeof(DWORD) * 8; // Skip 8 pointers - + tbuff += 4 * 8; // Skip pointers _pWAnim CopyInt(&pPlayer->_pWFrames, tbuff); CopyInt(&pPlayer->_pWWidth, tbuff); - - tbuff += sizeof(DWORD) * 8; // Skip 8 pointers - + tbuff += 4 * 8; // Skip pointers _pAAnim CopyInt(&pPlayer->_pAFrames, tbuff); CopyInt(&pPlayer->_pAWidth, tbuff); CopyInt(&pPlayer->_pAFNum, tbuff); - - tbuff += sizeof(DWORD) * 24; // Skip 24 pointers - + tbuff += 4 * 8; // Skip pointers _pLAnim + tbuff += 4 * 8; // Skip pointers _pFAnim + tbuff += 4 * 8; // Skip pointers _pTAnim CopyInt(&pPlayer->_pSFrames, tbuff); CopyInt(&pPlayer->_pSWidth, tbuff); CopyInt(&pPlayer->_pSFNum, tbuff); - - tbuff += sizeof(DWORD) * 8; // Skip 8 pointers - + tbuff += 4 * 8; // Skip pointers _pHAnim CopyInt(&pPlayer->_pHFrames, tbuff); CopyInt(&pPlayer->_pHWidth, tbuff); - - tbuff += sizeof(DWORD) * 8; // Skip 8 pointers - + tbuff += 4 * 8; // Skip pointers _pDAnim CopyInt(&pPlayer->_pDFrames, tbuff); CopyInt(&pPlayer->_pDWidth, tbuff); - - tbuff += sizeof(DWORD) * 8; // Skip 8 pointers - + tbuff += 4 * 8; // Skip pointers _pBAnim CopyInt(&pPlayer->_pBFrames, tbuff); CopyInt(&pPlayer->_pBWidth, tbuff); + SaveItems(pPlayer->InvBody, NUM_INVLOC); SaveItems(pPlayer->InvList, NUM_INV_GRID_ELEM); CopyInt(&pPlayer->_pNumInv, tbuff); CopyBytes(pPlayer->InvGrid, NUM_INV_GRID_ELEM, tbuff); SaveItems(pPlayer->SpdList, MAXBELTITEMS); SaveItem(&pPlayer->HoldItem); + CopyInt(&pPlayer->_pIMinDam, tbuff); CopyInt(&pPlayer->_pIMaxDam, tbuff); CopyInt(&pPlayer->_pIAC, tbuff); @@ -1116,15 +1128,15 @@ void SavePlayer(int i) CopyInt(&pPlayer->_pIBonusToHit, tbuff); CopyInt(&pPlayer->_pIBonusAC, tbuff); CopyInt(&pPlayer->_pIBonusDamMod, tbuff); - tbuff += 4; + tbuff += 4; // Alignment + CopyInt64(&pPlayer->_pISpells, tbuff); CopyInt(&pPlayer->_pIFlags, tbuff); CopyInt(&pPlayer->_pIGetHit, tbuff); CopyChar(&pPlayer->_pISplLvlAdd, tbuff); CopyChar(&pPlayer->_pISplCost, tbuff); - tbuff += 2; - + tbuff += 2; // Alignment CopyInt(&pPlayer->_pISplDur, tbuff); CopyInt(&pPlayer->_pIEnAc, tbuff); CopyInt(&pPlayer->_pIFMinDam, tbuff); @@ -1132,21 +1144,27 @@ void SavePlayer(int i) CopyInt(&pPlayer->_pILMinDam, tbuff); CopyInt(&pPlayer->_pILMaxDam, tbuff); CopyInt(&pPlayer->_pOilType, tbuff); - CopyChar(&pPlayer->pTownWarps, tbuff); CopyChar(&pPlayer->pDungMsgs, tbuff); CopyChar(&pPlayer->pLvlLoad, tbuff); CopyChar(&pPlayer->pBattleNet, tbuff); - CopyChar(&pPlayer->pManaShield, tbuff); CopyBytes(&pPlayer->bReserved, 3, tbuff); - CopyShorts(&pPlayer->wReserved, 8, tbuff); CopyInt(&pPlayer->pDiabloKillLevel, tbuff); CopyInts(&pPlayer->dwReserved, 7, tbuff); - // Omit 10 pointers + // Omit pointer _pNData + // Omit pointer _pWData + // Omit pointer _pAData + // Omit pointer _pLData + // Omit pointer _pFData + // Omit pointer _pTData + // Omit pointer _pHData + // Omit pointer _pDData + // Omit pointer _pBData + // Omit pointer pReserved } void SaveMonster(int i) @@ -1155,18 +1173,14 @@ void SaveMonster(int i) CopyInt(&pMonster->_mMTidx, tbuff); CopyInt(&pMonster->_mmode, tbuff); - CopyChar(&pMonster->_mgoal, tbuff); - tbuff += 3; - + tbuff += 3; // Alignment CopyInt(&pMonster->_mgoalvar1, tbuff); CopyInt(&pMonster->_mgoalvar2, tbuff); CopyInt(&pMonster->_mgoalvar3, tbuff); CopyInt(&pMonster->field_18, tbuff); - CopyChar(&pMonster->_pathcount, tbuff); - tbuff += 3; - + tbuff += 3; // Alignment CopyInt(&pMonster->_mx, tbuff); CopyInt(&pMonster->_my, tbuff); CopyInt(&pMonster->_mfutx, tbuff); @@ -1179,12 +1193,11 @@ void SaveMonster(int i) CopyInt(&pMonster->_myvel, tbuff); CopyInt(&pMonster->_mdir, tbuff); CopyInt(&pMonster->_menemy, tbuff); - CopyChar(&pMonster->_menemyx, tbuff); CopyChar(&pMonster->_menemyy, tbuff); CopyShort(&pMonster->falign_52, tbuff); - tbuff += 4; // Skip pointer + tbuff += 4; // Skip pointer _mAnimData CopyInt(&pMonster->_mAnimDelay, tbuff); CopyInt(&pMonster->_mAnimCnt, tbuff); CopyInt(&pMonster->_mAnimLen, tbuff); @@ -1205,12 +1218,9 @@ void SaveMonster(int i) CopyChar(&pMonster->_mAi, tbuff); CopyChar(&pMonster->_mint, tbuff); CopyShort(&pMonster->falign_9A, tbuff); - CopyInt(&pMonster->_mFlags, tbuff); - CopyChar(&pMonster->_msquelch, tbuff); - tbuff += 3; - + tbuff += 3; // Alignment CopyInt(&pMonster->falign_A4, tbuff); CopyInt(&pMonster->_lastx, tbuff); CopyInt(&pMonster->_lasty, tbuff); @@ -1221,27 +1231,24 @@ void SaveMonster(int i) CopyChar(&pMonster->_uniqtype, tbuff); CopyChar(&pMonster->_uniqtrans, tbuff); CopyChar(&pMonster->_udeadval, tbuff); - CopyChar(&pMonster->mWhoHit, tbuff); + CopyChar(&pMonster->mWhoHit, tbuff); CopyChar(&pMonster->mLevel, tbuff); - tbuff += 1; + tbuff += 1; // Alignment CopyShort(&pMonster->mExp, tbuff); CopyChar(&pMonster->mHit, tbuff); CopyChar(&pMonster->mMinDamage, tbuff); CopyChar(&pMonster->mMaxDamage, tbuff); CopyChar(&pMonster->mHit2, tbuff); - CopyChar(&pMonster->mMinDamage2, tbuff); CopyChar(&pMonster->mMaxDamage2, tbuff); CopyChar(&pMonster->mArmorClass, tbuff); CopyChar(&pMonster->falign_CB, tbuff); - CopyShort(&pMonster->mMagicRes, tbuff); - tbuff += 2; + tbuff += 2; // Alignment CopyInt(&pMonster->mtalkmsg, tbuff); - CopyChar(&pMonster->leader, tbuff); CopyChar(&pMonster->leaderflag, tbuff); CopyChar(&pMonster->packsize, tbuff); @@ -1271,10 +1278,9 @@ void SaveMissile(int i) CopyInt(&pMissile->_mispllvl, tbuff); CopyInt(&pMissile->_miDelFlag, tbuff); CopyChar(&pMissile->_miAnimType, tbuff); - tbuff += 3; - + tbuff += 3; // Alignment CopyInt(&pMissile->_miAnimFlags, tbuff); - tbuff += 4; + tbuff += 4; // Skip pointer _miAnimData CopyInt(&pMissile->_miAnimDelay, tbuff); CopyInt(&pMissile->_miAnimLen, tbuff); CopyInt(&pMissile->_miAnimWidth, tbuff); @@ -1307,12 +1313,13 @@ void SaveMissile(int i) void SaveObject(int i) { ObjectStruct *pObject = &object[i]; + CopyInt(&pObject->_otype, tbuff); CopyInt(&pObject->_ox, tbuff); CopyInt(&pObject->_oy, tbuff); CopyInt(&pObject->_oLight, tbuff); CopyInt(&pObject->_oAnimFlag, tbuff); - tbuff += 4; + tbuff += 4; // Skip pointer _oAnimData CopyInt(&pObject->_oAnimDelay, tbuff); CopyInt(&pObject->_oAnimCnt, tbuff); CopyInt(&pObject->_oAnimLen, tbuff); @@ -1320,16 +1327,13 @@ void SaveObject(int i) CopyInt(&pObject->_oAnimWidth, tbuff); CopyInt(&pObject->_oAnimWidth2, tbuff); CopyInt(&pObject->_oDelFlag, tbuff); - CopyChar(&pObject->_oBreak, tbuff); - tbuff += 3; - + tbuff += 3; // Alignment CopyInt(&pObject->_oSolidFlag, tbuff); CopyInt(&pObject->_oMissFlag, tbuff); CopyChar(&pObject->_oSelFlag, tbuff); - tbuff += 3; - + tbuff += 3; // Alignment CopyInt(&pObject->_oPreFlag, tbuff); CopyInt(&pObject->_oTrapFlag, tbuff); CopyInt(&pObject->_oDoorFlag, tbuff); @@ -1349,7 +1353,7 @@ void SaveItem(ItemStruct *pItem) { CopyInt(&pItem->_iSeed, tbuff); CopyShort(&pItem->_iCreateInfo, tbuff); - tbuff += 2; + tbuff += 2; // Alignment CopyInt(&pItem->_itype, tbuff); CopyInt(&pItem->_ix, tbuff); CopyInt(&pItem->_iy, tbuff); @@ -1358,10 +1362,10 @@ void SaveItem(ItemStruct *pItem) CopyInt(&pItem->_iAnimLen, tbuff); CopyInt(&pItem->_iAnimFrame, tbuff); CopyInt(&pItem->_iAnimWidth, tbuff); - CopyInt(&pItem->_iAnimWidth2, tbuff); // width 2? - CopyInt(&pItem->_isin, tbuff); // set when item is flagged for deletion, deprecated in 1.02 + CopyInt(&pItem->_iAnimWidth2, tbuff); + CopyInt(&pItem->_isin, tbuff); CopyChar(&pItem->_iSelFlag, tbuff); - tbuff += 3; + tbuff += 3; // Alignment CopyInt(&pItem->_iPostDraw, tbuff); CopyInt(&pItem->_iIdentified, tbuff); CopyChar(&pItem->_iMagical, tbuff); @@ -1369,7 +1373,7 @@ void SaveItem(ItemStruct *pItem) CopyBytes(&pItem->_iIName, 64, tbuff); CopyChar(&pItem->_iLoc, tbuff); CopyChar(&pItem->_iClass, tbuff); - tbuff += 1; + tbuff += 1; // Alignment CopyInt(&pItem->_iCurs, tbuff); CopyInt(&pItem->_ivalue, tbuff); CopyInt(&pItem->_iIvalue, tbuff); @@ -1400,7 +1404,7 @@ void SaveItem(ItemStruct *pItem) CopyInt(&pItem->_iPLLight, tbuff); CopyChar(&pItem->_iSplLvlAdd, tbuff); CopyChar(&pItem->_iRequest, tbuff); - tbuff += 2; + tbuff += 2; // Alignment CopyInt(&pItem->_iUid, tbuff); CopyInt(&pItem->_iFMinDam, tbuff); CopyInt(&pItem->_iFMaxDam, tbuff); @@ -1409,7 +1413,7 @@ void SaveItem(ItemStruct *pItem) CopyInt(&pItem->_iPLEnAc, tbuff); CopyChar(&pItem->_iPrePower, tbuff); CopyChar(&pItem->_iSufPower, tbuff); - tbuff += 2; + tbuff += 2; // Alignment CopyInt(&pItem->_iVAdd1, tbuff); CopyInt(&pItem->_iVMult1, tbuff); CopyInt(&pItem->_iVAdd2, tbuff); @@ -1417,7 +1421,7 @@ void SaveItem(ItemStruct *pItem) CopyChar(&pItem->_iMinStr, tbuff); CopyChar(&pItem->_iMinMag, tbuff); CopyChar(&pItem->_iMinDex, tbuff); - tbuff += 1; + tbuff += 1; // Alignment CopyInt(&pItem->_iStatFlag, tbuff); CopyInt(&pItem->IDidx, tbuff); CopyInt(&pItem->offs016C, tbuff); @@ -1437,8 +1441,22 @@ void SavePremium(int i) void SaveQuest(int i) { - memcpy(tbuff, &quests[i], sizeof(*quests)); - tbuff += sizeof(*quests); + QuestStruct *pQuest = &quests[i]; + + CopyChar(&pQuest->_qlevel, tbuff); + CopyChar(&pQuest->_qtype, tbuff); + CopyChar(&pQuest->_qactive, tbuff); + CopyChar(&pQuest->_qlvltype, tbuff); + CopyInt(&pQuest->_qtx, tbuff); + CopyInt(&pQuest->_qty, tbuff); + CopyChar(&pQuest->_qslvl, tbuff); + CopyChar(&pQuest->_qidx, tbuff); + CopyChar(&pQuest->_qmsg, tbuff); + CopyChar(&pQuest->_qvar1, tbuff); + CopyChar(&pQuest->_qvar2, tbuff); + tbuff += 3; // Alignment + CopyInt(&pQuest->_qlog, tbuff); + WSave(ReturnLvlX); WSave(ReturnLvlY); WSave(ReturnLvl); @@ -1448,20 +1466,52 @@ void SaveQuest(int i) void SaveLighting(int i) { - memcpy(tbuff, &LightList[i], sizeof(*LightList)); - tbuff += sizeof(*LightList); + LightListStruct *pLight = &LightList[i]; + + CopyInt(&pLight->_lx, tbuff); + CopyInt(&pLight->_ly, tbuff); + CopyInt(&pLight->_lradius, tbuff); + CopyInt(&pLight->_lid, tbuff); + CopyInt(&pLight->_ldel, tbuff); + CopyInt(&pLight->_lunflag, tbuff); + CopyInt(&pLight->field_18, tbuff); + CopyInt(&pLight->_lunx, tbuff); + CopyInt(&pLight->_luny, tbuff); + CopyInt(&pLight->_lunr, tbuff); + CopyInt(&pLight->_xoff, tbuff); + CopyInt(&pLight->_yoff, tbuff); + CopyInt(&pLight->_lflags, tbuff); } void SaveVision(int i) { - memcpy(tbuff, &VisionList[i], sizeof(*VisionList)); - tbuff += sizeof(*VisionList); + LightListStruct *pVision = &VisionList[i]; + + CopyInt(&pVision->_lx, tbuff); + CopyInt(&pVision->_ly, tbuff); + CopyInt(&pVision->_lradius, tbuff); + CopyInt(&pVision->_lid, tbuff); + CopyInt(&pVision->_ldel, tbuff); + CopyInt(&pVision->_lunflag, tbuff); + CopyInt(&pVision->field_18, tbuff); + CopyInt(&pVision->_lunx, tbuff); + CopyInt(&pVision->_luny, tbuff); + CopyInt(&pVision->_lunr, tbuff); + CopyInt(&pVision->_xoff, tbuff); + CopyInt(&pVision->_yoff, tbuff); + CopyInt(&pVision->_lflags, tbuff); } void SavePortal(int i) { - memcpy(tbuff, &portal[i], sizeof(*portal)); - tbuff += sizeof(*portal); + PortalStruct *pPortal = &portal[i]; + + CopyInt(&pPortal->open, tbuff); + CopyInt(&pPortal->x, tbuff); + CopyInt(&pPortal->y, tbuff); + CopyInt(&pPortal->level, tbuff); + CopyInt(&pPortal->ltype, tbuff); + CopyInt(&pPortal->setlvl, tbuff); } void SaveLevel() diff --git a/Source/loadsave.h b/Source/loadsave.h index fa03d7dbb..f82397366 100644 --- a/Source/loadsave.h +++ b/Source/loadsave.h @@ -9,8 +9,8 @@ char BLoad(); int WLoad(); int ILoad(); BOOL OLoad(); -void CopyItems(const int n, ItemStruct *pItem); -void CopyItem(ItemStruct *pItem); +void LoadItems(const int n, ItemStruct *pItem); +void LoadItemData(ItemStruct *pItem); void SaveItem(ItemStruct *pItem); void SaveItems(ItemStruct *pItem, const int n); diff --git a/SourceX/DiabloUI/diabloui.cpp b/SourceX/DiabloUI/diabloui.cpp index a8ad82775..11bc11383 100644 --- a/SourceX/DiabloUI/diabloui.cpp +++ b/SourceX/DiabloUI/diabloui.cpp @@ -216,22 +216,22 @@ bool UiFocusNavigation(SDL_Event *event) if (event->type == SDL_QUIT) exit(0); - switch(event->type) { - case SDL_KEYUP: - case SDL_MOUSEBUTTONUP: - case SDL_MOUSEMOTION: - case SDL_MOUSEWHEEL: - case SDL_JOYBUTTONUP: - case SDL_JOYAXISMOTION: - case SDL_JOYBALLMOTION: - case SDL_JOYHATMOTION: - case SDL_FINGERUP: - case SDL_FINGERMOTION: - case SDL_CONTROLLERBUTTONUP: - case SDL_CONTROLLERAXISMOTION: - case SDL_SYSWMEVENT: - case SDL_WINDOWEVENT: - mainmenu_restart_repintro(); + switch (event->type) { + case SDL_KEYUP: + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEMOTION: + case SDL_MOUSEWHEEL: + case SDL_JOYBUTTONUP: + case SDL_JOYAXISMOTION: + case SDL_JOYBALLMOTION: + case SDL_JOYHATMOTION: + case SDL_FINGERUP: + case SDL_FINGERMOTION: + case SDL_CONTROLLERBUTTONUP: + case SDL_CONTROLLERAXISMOTION: + case SDL_SYSWMEVENT: + case SDL_WINDOWEVENT: + mainmenu_restart_repintro(); } if (event->type == SDL_KEYDOWN) { diff --git a/structs.h b/structs.h index 377b575f1..5ef9d5474 100644 --- a/structs.h +++ b/structs.h @@ -655,7 +655,6 @@ typedef struct ObjDataStruct { BOOL oTrapFlag; } ObjDataStruct; -#pragma pack(push, 4) typedef struct ObjectStruct { int _otype; int _ox; @@ -688,13 +687,11 @@ typedef struct ObjectStruct { int _oVar7; int _oVar8; } ObjectStruct; -#pragma pack(pop) ////////////////////////////////////////////////// // portal ////////////////////////////////////////////////// -#pragma pack(push, 4) typedef struct PortalStruct { BOOL open; int x; @@ -703,7 +700,6 @@ typedef struct PortalStruct { int ltype; BOOL setlvl; } PortalStruct; -#pragma pack(pop) ////////////////////////////////////////////////// // msg @@ -972,7 +968,6 @@ typedef struct TBuffer { // quests ////////////////////////////////////////////////// -#pragma pack(push, 4) typedef struct QuestStruct { unsigned char _qlevel; unsigned char _qtype; @@ -987,7 +982,6 @@ typedef struct QuestStruct { unsigned char _qvar2; int _qlog; } QuestStruct; -#pragma pack(pop) typedef struct QuestData { unsigned char _qdlvl;