From 61a580588ca09decdba01003cb45c49212454f99 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sat, 2 Jan 2021 22:35:42 +0100 Subject: [PATCH] Unify save game loading --- Source/gamemenu.cpp | 2 +- Source/items.cpp | 2 +- Source/loadsave.cpp | 140 +++++++++++++++++++++++++------------------- Source/mainmenu.cpp | 2 +- defs.h | 14 ++--- structs.h | 2 - 6 files changed, 88 insertions(+), 74 deletions(-) diff --git a/Source/gamemenu.cpp b/Source/gamemenu.cpp index 57d128a6c..6817bc795 100644 --- a/Source/gamemenu.cpp +++ b/Source/gamemenu.cpp @@ -380,7 +380,7 @@ void gamemenu_loadjog(BOOL bActivate) { if (gbMaxPlayers == 1) { jogging_opt = !jogging_opt; - SRegSaveValue(APP_NAME, jogging_title, FALSE, jogging_opt); + SRegSaveValue("Hellfire", jogging_title, FALSE, jogging_opt); PlaySFX(IS_TITLEMOV); gamemenu_jogging(); } diff --git a/Source/items.cpp b/Source/items.cpp index 1eac16bbf..69d07b2d0 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -1940,6 +1940,7 @@ void GetItemAttrs(int i, int idata, int lvl) item[i]._iPLHP = 0; item[i]._iPrePower = -1; item[i]._iSufPower = -1; + item[i]._iDamAcFlags = 0; #ifndef HELLFIRE if (item[i]._iMiscId == IMISC_BOOK) @@ -1954,7 +1955,6 @@ void GetItemAttrs(int i, int idata, int lvl) rndv = 5 * (currlevel + 32) + random_(21, 10 * (currlevel + 32)); #else item[i]._iFlags = 0; - item[i]._iDamAcFlags = 0; if (item[i]._iMiscId == IMISC_BOOK) GetBookSpell(i, lvl); diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index 43170e8c8..ef06c7c4f 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -9,6 +9,11 @@ DEVILUTION_BEGIN_NAMESPACE BYTE *tbuff; +bool gbIsHellfireSaveGame; +int giNumberOfLevels; +int giNumberQuests; +int giNumberOfSmitPremiumItems; + static char BLoad() { return *tbuff++; @@ -179,9 +184,10 @@ static void LoadItemData(ItemStruct *pItem) CopyInt(tbuff, &pItem->_iStatFlag); CopyInt(tbuff, &pItem->IDidx); CopyInt(tbuff, &pItem->offs016C); -#ifdef HELLFIRE - CopyInt(tbuff, &pItem->_iDamAcFlags); -#endif + if (gbIsHellfireSaveGame) + CopyInt(tbuff, &pItem->_iDamAcFlags); + else + pItem->_iDamAcFlags = 0; } static void LoadItems(const int n, ItemStruct *pItem) @@ -309,8 +315,8 @@ static void LoadPlayer(int i) CopyInt(tbuff, &pPlayer->_pVar6); CopyInt(tbuff, &pPlayer->_pVar7); CopyInt(tbuff, &pPlayer->_pVar8); - CopyBytes(tbuff, NUMLEVELS, &pPlayer->_pLvlVisited); - CopyBytes(tbuff, NUMLEVELS, &pPlayer->_pSLvlVisited); + CopyBytes(tbuff, giNumberOfLevels, &pPlayer->_pSLvlVisited); + CopyBytes(tbuff, giNumberOfLevels, &pPlayer->_pLvlVisited); tbuff += 2; // Alignment CopyInt(tbuff, &pPlayer->_pGFXLoad); @@ -372,12 +378,14 @@ static 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 + + if (gbIsHellfireSaveGame) { + CopyChar(tbuff, &pPlayer->pDungMsgs2); + pPlayer->pBattleNet = false; + } else { + pPlayer->pDungMsgs2 = 0; + CopyChar(tbuff, &pPlayer->pBattleNet); + } CopyChar(tbuff, &pPlayer->pManaShield); CopyBytes(tbuff, 3, &pPlayer->bReserved); CopyShort(tbuff, &pPlayer->wReflection); @@ -607,19 +615,19 @@ static void LoadQuest(int i) CopyInt(tbuff, &pQuest->_qty); CopyChar(tbuff, &pQuest->_qslvl); CopyChar(tbuff, &pQuest->_qidx); -#ifdef HELLFIRE - tbuff += 2; // Alignment - CopyInt(tbuff, &pQuest->_qmsg); -#else - CopyChar(tbuff, &pQuest->_qmsg); -#endif + if (gbIsHellfireSaveGame) { + tbuff += 2; // Alignment + CopyInt(tbuff, &pQuest->_qmsg); + } else { + BYTE tmp; + CopyChar(tbuff, &tmp); + pQuest->_qmsg = tmp; + } CopyChar(tbuff, &pQuest->_qvar1); CopyChar(tbuff, &pQuest->_qvar2); -#ifdef HELLFIRE tbuff += 2; // Alignment -#else - tbuff += 3; // Alignment -#endif + if (!gbIsHellfireSaveGame) + tbuff += 1; // Alignment CopyInt(tbuff, &pQuest->_qlog); ReturnLvlX = WLoad(); @@ -681,21 +689,20 @@ static void LoadPortal(int i) static bool IsHeaderValid(int magicNumber) { - if (gbIsSpawn) { - if (magicNumber != 'SHAR') { - return false; - } - } else { -#ifdef HELLFIRE - if (magicNumber != 'HELF') { -#else - if (magicNumber != 'RETL') { -#endif - return false; - } + gbIsHellfireSaveGame = false; + if (magicNumber == 'SHAR') { + return true; + } else if (gbIsHellfire && magicNumber == 'SHLF') { + gbIsHellfireSaveGame = true; + return true; + } else if (!gbIsSpawn && magicNumber == 'RETL') { + return true; + } else if (!gbIsSpawn && gbIsHellfire && magicNumber == 'HELF') { + gbIsHellfireSaveGame = true; + return true; } - return true; + return false; } /** @@ -719,6 +726,17 @@ void LoadGame(BOOL firstflag) if (!IsHeaderValid(ILoad())) app_fatal("Invalid save file"); + if (gbIsHellfireSaveGame) { + giNumberOfLevels = 25; + giNumberQuests = 24; + giNumberOfSmitPremiumItems = 15; + } else { + // Todo initialize additional levels and quests if we are running Hellfire + giNumberOfLevels = 17; + giNumberQuests = 16; + giNumberOfSmitPremiumItems = 6; + } + setlevel = OLoad(); setlvlnum = WLoad(); currlevel = WLoad(); @@ -732,7 +750,7 @@ void LoadGame(BOOL firstflag) _nummissiles = WLoad(); _nobjects = WLoad(); - for (i = 0; i < NUMLEVELS; i++) { + for (i = 0; i < giNumberOfLevels; i++) { glSeedTbl[i] = ILoad(); gnLevelTypeTbl[i] = WLoad(); } @@ -743,7 +761,7 @@ void LoadGame(BOOL firstflag) if (gnDifficulty < DIFF_NORMAL || gnDifficulty > DIFF_HELL) gnDifficulty = DIFF_NORMAL; - for (i = 0; i < MAXQUESTS; i++) + for (i = 0; i < giNumberQuests; i++) LoadQuest(i); for (i = 0; i < MAXPORTAL; i++) LoadPortal(i); @@ -856,8 +874,10 @@ void LoadGame(BOOL firstflag) numpremium = WLoad(); premiumlevel = WLoad(); - for (i = 0; i < SMITH_PREMIUM_ITEMS; i++) + for (i = 0; i < giNumberOfSmitPremiumItems; i++) LoadPremium(i); + if (gbIsHellfire && !gbIsHellfireSaveGame) + SpawnPremium(myplr); automapflag = OLoad(); AutoMapScale = WLoad(); @@ -981,9 +1001,8 @@ static void SaveItem(ItemStruct *pItem) CopyInt(&pItem->_iStatFlag, tbuff); CopyInt(&pItem->IDidx, tbuff); CopyInt(&pItem->offs016C, tbuff); -#ifdef HELLFIRE - CopyInt(&pItem->_iDamAcFlags, tbuff); -#endif + if (gbIsHellfire) + CopyInt(&pItem->_iDamAcFlags, tbuff); } static void SaveItems(ItemStruct *pItem, const int n) @@ -1172,11 +1191,10 @@ static 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 + if (gbIsHellfire) + CopyChar(&pPlayer->pDungMsgs2, tbuff); + else + CopyChar(&pPlayer->pBattleNet, tbuff); CopyChar(&pPlayer->pManaShield, tbuff); CopyChar(&pPlayer->pDungMsgs2, tbuff); CopyBytes(&pPlayer->bReserved, 2, tbuff); @@ -1404,19 +1422,18 @@ static void SaveQuest(int i) CopyInt(&pQuest->_qty, tbuff); CopyChar(&pQuest->_qslvl, tbuff); CopyChar(&pQuest->_qidx, tbuff); -#ifdef HELLFIRE - tbuff += 2; // Alignment - CopyInt(&pQuest->_qmsg, tbuff); -#else - CopyChar(&pQuest->_qmsg, tbuff); -#endif + if (gbIsHellfire) { + tbuff += 2; // Alignment + CopyInt(&pQuest->_qmsg, tbuff); + } else { + char tmp = pQuest->_qmsg; + CopyChar(&tmp, tbuff); + } CopyChar(&pQuest->_qvar1, tbuff); CopyChar(&pQuest->_qvar2, tbuff); -#ifdef HELLFIRE tbuff += 2; // Alignment -#else - tbuff += 3; // Alignment -#endif + if (!gbIsHellfire) + tbuff += 1; // Alignment CopyInt(&pQuest->_qlog, tbuff); WSave(ReturnLvlX); @@ -1485,14 +1502,17 @@ void SaveGame() BYTE *SaveBuff = DiabloAllocPtr(dwLen); tbuff = SaveBuff; - if (gbIsSpawn) + if (gbIsSpawn && !gbIsHellfire) ISave('SHAR'); - else -#ifdef HELLFIRE + else if (gbIsSpawn && gbIsHellfire) + ISave('SHLF'); + else if (!gbIsSpawn && gbIsHellfire) ISave('HELF'); -#else + else if (!gbIsSpawn && !gbIsHellfire) ISave('RETL'); -#endif + else + app_fatal("Invalid game state"); + OSave(setlevel); WSave(setlvlnum); WSave(currlevel); diff --git a/Source/mainmenu.cpp b/Source/mainmenu.cpp index dfb0a1e8f..89683f0da 100644 --- a/Source/mainmenu.cpp +++ b/Source/mainmenu.cpp @@ -49,7 +49,7 @@ static BOOL mainmenu_init_menu(int type) static BOOL mainmenu_single_player() { #ifdef HELLFIRE - if (!SRegLoadValue(APP_NAME, jogging_title, 0, &jogging_opt)) { + if (!SRegLoadValue("Hellfire", jogging_title, 0, &jogging_opt)) { jogging_opt = TRUE; } #endif diff --git a/defs.h b/defs.h index 39a0eaf7a..0fd23f311 100644 --- a/defs.h +++ b/defs.h @@ -6,17 +6,9 @@ #ifdef HELLFIRE #define DIABOOL BOOLEAN -#define GAME_NAME "HELLFIRE" -#define APP_NAME "Hellfire" -#else -#define DIABOOL BOOL -#define GAME_NAME "DIABLO" -#define APP_NAME "Diablo" -#endif - -#ifdef HELLFIRE #define HFAND && #else +#define DIABOOL BOOL #define HFAND & #endif @@ -59,6 +51,7 @@ #define MAXMONSTERS 200 #define MAXOBJECTS 127 #define MAXPORTAL 4 + #ifdef HELLFIRE #define MAXQUESTS 24 #define MAXMULTIQUESTS 10 @@ -66,13 +59,16 @@ #define MAXQUESTS 16 #define MAXMULTIQUESTS 4 #endif + #define MAXTHEMES 50 #define MAXTILES 2048 + #ifdef HELLFIRE #define MAXTRIGGERS 7 #else #define MAXTRIGGERS 5 #endif + #define MAXVISION 32 #define MDMAXX 40 #define MDMAXY 40 diff --git a/structs.h b/structs.h index a0bb5bf2d..776bf1bc1 100644 --- a/structs.h +++ b/structs.h @@ -171,9 +171,7 @@ typedef struct ItemStruct { BOOL _iStatFlag; int IDidx; int offs016C; // _oldlight or _iInvalid -#ifdef HELLFIRE int _iDamAcFlags; -#endif } ItemStruct; //////////////////////////////////////////////////