From 57f0f5f4c75ab37196aee92118aa47f7d27ef307 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Tue, 13 Oct 2020 05:12:20 +0200 Subject: [PATCH] Handle hellfire save game differences --- Source/loadsave.cpp | 41 ++++++++++++++++++++++++++++------------- Source/pfile.cpp | 16 ++++++++++++++++ Source/player.cpp | 11 ----------- structs.h | 14 ++++---------- 4 files changed, 48 insertions(+), 34 deletions(-) diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index 47445f978..c8b3b6097 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -288,7 +288,6 @@ void CopyInt64(const void *src, void *dst) void LoadPlayer(int i) { PlayerStruct *pPlayer = &plr[i]; - char tempChar; CopyInt(tbuff, &pPlayer->_pmode); CopyBytes(tbuff, MAX_PATH_LENGTH, pPlayer->walkpath); @@ -456,9 +455,7 @@ void LoadPlayer(int i) CopyInt(tbuff, &pPlayer->_pIGetHit); CopyChar(tbuff, &pPlayer->_pISplLvlAdd); CopyChar(tbuff, &pPlayer->_pISplCost); - CopyChar(tbuff, &tempChar); - pPlayer->pDifficulty = tempChar & 3; // Use 2 alignment bits for difficulty - tbuff += 1; // Alignment + tbuff += 2; // Alignment CopyInt(tbuff, &pPlayer->_pISplDur); CopyInt(tbuff, &pPlayer->_pIEnAc); CopyInt(tbuff, &pPlayer->_pIFMinDam); @@ -469,13 +466,26 @@ void LoadPlayer(int i) CopyChar(tbuff, &pPlayer->pTownWarps); CopyChar(tbuff, &pPlayer->pDungMsgs); CopyChar(tbuff, &pPlayer->pLvlLoad); +#ifdef HELLFIRE + CopyChar(tbuff, &pPlayer->pDungMsgs2); + pPlayer->pBattleNet = false; +#else CopyChar(tbuff, &pPlayer->pBattleNet); +#endif CopyChar(tbuff, &pPlayer->pManaShield); +#ifndef HELLFIRE CopyBytes(tbuff, 3, &pPlayer->bReserved); - CopyShorts(tbuff, 8, &pPlayer->wReserved); +#else + CopyChar(tbuff, &pPlayer->pDungMsgs2); + CopyBytes(tbuff, 2, &pPlayer->bReserved); +#endif + CopyShort(tbuff, &pPlayer->wReflection); + CopyShorts(tbuff, 7, &pPlayer->wReserved); CopyInt(tbuff, &pPlayer->pDiabloKillLevel); - CopyInts(tbuff, 7, &pPlayer->dwReserved); + CopyInt(tbuff, &pPlayer->pDifficulty); + CopyInt(tbuff, &pPlayer->pDamAcFlags); + CopyInts(tbuff, 5, &pPlayer->dwReserved); // Omit pointer _pNData // Omit pointer _pWData @@ -1024,7 +1034,6 @@ void OSave(BOOL v) void SavePlayer(int i) { PlayerStruct *pPlayer = &plr[i]; - char tempChar; CopyInt(&pPlayer->_pmode, tbuff); CopyBytes(&pPlayer->walkpath, MAX_PATH_LENGTH, tbuff); @@ -1190,9 +1199,7 @@ void SavePlayer(int i) CopyChar(&pPlayer->_pISplLvlAdd, tbuff); CopyChar(&pPlayer->_pISplCost, tbuff); - tempChar = pPlayer->pDifficulty & 3; // Use 2 alignment bits for difficulty - CopyChar(&tempChar, tbuff); - tbuff += 1; // Alignment + tbuff += 2; // Alignment CopyInt(&pPlayer->_pISplDur, tbuff); CopyInt(&pPlayer->_pIEnAc, tbuff); CopyInt(&pPlayer->_pIFMinDam, tbuff); @@ -1203,13 +1210,21 @@ void SavePlayer(int i) CopyChar(&pPlayer->pTownWarps, tbuff); CopyChar(&pPlayer->pDungMsgs, tbuff); CopyChar(&pPlayer->pLvlLoad, tbuff); +#ifdef HELLFIRE + CopyChar(&pPlayer->pDungMsgs2, tbuff); +#else CopyChar(&pPlayer->pBattleNet, tbuff); +#endif CopyChar(&pPlayer->pManaShield, tbuff); - CopyBytes(&pPlayer->bReserved, 3, tbuff); - CopyShorts(&pPlayer->wReserved, 8, tbuff); + CopyChar(&pPlayer->pDungMsgs2, tbuff); + CopyBytes(&pPlayer->bReserved, 2, tbuff); + CopyShort(&pPlayer->wReflection, tbuff); + CopyShorts(&pPlayer->wReserved, 7, tbuff); CopyInt(&pPlayer->pDiabloKillLevel, tbuff); - CopyInts(&pPlayer->dwReserved, 7, tbuff); + CopyInt(&pPlayer->pDifficulty, tbuff); + CopyInt(&pPlayer->pDamAcFlags, tbuff); + CopyInts(&pPlayer->dwReserved, 5, tbuff); // Omit pointer _pNData // Omit pointer _pWData diff --git a/Source/pfile.cpp b/Source/pfile.cpp index b4f8c2026..9bc1aaeb4 100644 --- a/Source/pfile.cpp +++ b/Source/pfile.cpp @@ -80,15 +80,31 @@ void pfile_get_save_path(char *pszBuf, DWORD dwBufSize, DWORD save_num) char path[MAX_PATH]; #ifdef SPAWN +#ifdef HELLFIRE + const char *fmt = "%sshare_%d.hsv"; +#else const char *fmt = "%sshare_%d.sv"; +#endif if (gbMaxPlayers <= 1) +#ifdef HELLFIRE + fmt = "%sspawn%d.hsv"; +#else fmt = "%sspawn%d.sv"; +#endif +#else +#ifdef HELLFIRE + const char *fmt = "%shrinfo_%d.drv"; #else const char *fmt = "%smulti_%d.sv"; +#endif if (gbMaxPlayers <= 1) +#ifdef HELLFIRE + fmt = "%ssingle_%d.hsv"; +#else fmt = "%ssingle_%d.sv"; +#endif #endif GetPrefPath(path, MAX_PATH); diff --git a/Source/player.cpp b/Source/player.cpp index 8ad471ed6..dcfb45d66 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -695,16 +695,9 @@ void SetPlrAnims(int pnum) void ClearPlrRVars(PlayerStruct *p) { // TODO: Missing debug assert p != NULL -#ifdef HELLFIRE - p->pManaShield = 0; -#endif p->bReserved[0] = 0; p->bReserved[1] = 0; - p->bReserved[2] = 0; -#ifndef HELLFIRE - p->wReflection = 0; -#endif p->wReserved[0] = 0; p->wReserved[1] = 0; p->wReserved[2] = 0; @@ -713,10 +706,6 @@ void ClearPlrRVars(PlayerStruct *p) p->wReserved[5] = 0; p->wReserved[6] = 0; -#ifndef HELLFIRE - p->pDifficulty = 0; - p->pDamAcFlags = 0; -#endif p->dwReserved[0] = 0; p->dwReserved[1] = 0; p->dwReserved[2] = 0; diff --git a/structs.h b/structs.h index 896ba3481..56c792597 100644 --- a/structs.h +++ b/structs.h @@ -343,13 +343,10 @@ typedef struct PlayerStruct { unsigned char pTownWarps; unsigned char pDungMsgs; unsigned char pLvlLoad; -#ifdef HELLFIRE - unsigned char pDungMsgs2; -#else unsigned char pBattleNet; -#endif BOOLEAN pManaShield; - char bReserved[3]; + unsigned char pDungMsgs2; + char bReserved[2]; short wReflection; short wReserved[7]; DWORD pDiabloKillLevel; @@ -1485,13 +1482,10 @@ typedef struct PkPlayerStruct { char pTownWarps; char pDungMsgs; char pLvlLoad; -#ifdef HELLFIRE - unsigned char pDungMsgs2; -#else char pBattleNet; -#endif BOOLEAN pManaShield; - char bReserved[3]; + unsigned char pDungMsgs2; + char bReserved[2]; short wReflection; short wReserved[7]; DWORD pDiabloKillLevel;