Browse Source

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)
pull/261/head
Anders Jenbo 7 years ago
parent
commit
049178cb2e
  1. 446
      Source/loadsave.cpp
  2. 4
      Source/loadsave.h
  3. 32
      SourceX/DiabloUI/diabloui.cpp
  4. 6
      structs.h

446
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()

4
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);

32
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) {

6
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;

Loading…
Cancel
Save