Browse Source

Unify save game loading

pull/970/head
Anders Jenbo 5 years ago
parent
commit
61a580588c
  1. 2
      Source/gamemenu.cpp
  2. 2
      Source/items.cpp
  3. 140
      Source/loadsave.cpp
  4. 2
      Source/mainmenu.cpp
  5. 14
      defs.h
  6. 2
      structs.h

2
Source/gamemenu.cpp

@ -380,7 +380,7 @@ void gamemenu_loadjog(BOOL bActivate)
{ {
if (gbMaxPlayers == 1) { if (gbMaxPlayers == 1) {
jogging_opt = !jogging_opt; jogging_opt = !jogging_opt;
SRegSaveValue(APP_NAME, jogging_title, FALSE, jogging_opt); SRegSaveValue("Hellfire", jogging_title, FALSE, jogging_opt);
PlaySFX(IS_TITLEMOV); PlaySFX(IS_TITLEMOV);
gamemenu_jogging(); gamemenu_jogging();
} }

2
Source/items.cpp

@ -1940,6 +1940,7 @@ void GetItemAttrs(int i, int idata, int lvl)
item[i]._iPLHP = 0; item[i]._iPLHP = 0;
item[i]._iPrePower = -1; item[i]._iPrePower = -1;
item[i]._iSufPower = -1; item[i]._iSufPower = -1;
item[i]._iDamAcFlags = 0;
#ifndef HELLFIRE #ifndef HELLFIRE
if (item[i]._iMiscId == IMISC_BOOK) 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)); rndv = 5 * (currlevel + 32) + random_(21, 10 * (currlevel + 32));
#else #else
item[i]._iFlags = 0; item[i]._iFlags = 0;
item[i]._iDamAcFlags = 0;
if (item[i]._iMiscId == IMISC_BOOK) if (item[i]._iMiscId == IMISC_BOOK)
GetBookSpell(i, lvl); GetBookSpell(i, lvl);

140
Source/loadsave.cpp

@ -9,6 +9,11 @@ DEVILUTION_BEGIN_NAMESPACE
BYTE *tbuff; BYTE *tbuff;
bool gbIsHellfireSaveGame;
int giNumberOfLevels;
int giNumberQuests;
int giNumberOfSmitPremiumItems;
static char BLoad() static char BLoad()
{ {
return *tbuff++; return *tbuff++;
@ -179,9 +184,10 @@ static void LoadItemData(ItemStruct *pItem)
CopyInt(tbuff, &pItem->_iStatFlag); CopyInt(tbuff, &pItem->_iStatFlag);
CopyInt(tbuff, &pItem->IDidx); CopyInt(tbuff, &pItem->IDidx);
CopyInt(tbuff, &pItem->offs016C); CopyInt(tbuff, &pItem->offs016C);
#ifdef HELLFIRE if (gbIsHellfireSaveGame)
CopyInt(tbuff, &pItem->_iDamAcFlags); CopyInt(tbuff, &pItem->_iDamAcFlags);
#endif else
pItem->_iDamAcFlags = 0;
} }
static void LoadItems(const int n, ItemStruct *pItem) static void LoadItems(const int n, ItemStruct *pItem)
@ -309,8 +315,8 @@ static void LoadPlayer(int i)
CopyInt(tbuff, &pPlayer->_pVar6); CopyInt(tbuff, &pPlayer->_pVar6);
CopyInt(tbuff, &pPlayer->_pVar7); CopyInt(tbuff, &pPlayer->_pVar7);
CopyInt(tbuff, &pPlayer->_pVar8); CopyInt(tbuff, &pPlayer->_pVar8);
CopyBytes(tbuff, NUMLEVELS, &pPlayer->_pLvlVisited); CopyBytes(tbuff, giNumberOfLevels, &pPlayer->_pSLvlVisited);
CopyBytes(tbuff, NUMLEVELS, &pPlayer->_pSLvlVisited); CopyBytes(tbuff, giNumberOfLevels, &pPlayer->_pLvlVisited);
tbuff += 2; // Alignment tbuff += 2; // Alignment
CopyInt(tbuff, &pPlayer->_pGFXLoad); CopyInt(tbuff, &pPlayer->_pGFXLoad);
@ -372,12 +378,14 @@ static void LoadPlayer(int i)
CopyChar(tbuff, &pPlayer->pTownWarps); CopyChar(tbuff, &pPlayer->pTownWarps);
CopyChar(tbuff, &pPlayer->pDungMsgs); CopyChar(tbuff, &pPlayer->pDungMsgs);
CopyChar(tbuff, &pPlayer->pLvlLoad); CopyChar(tbuff, &pPlayer->pLvlLoad);
#ifdef HELLFIRE
CopyChar(tbuff, &pPlayer->pDungMsgs2); if (gbIsHellfireSaveGame) {
pPlayer->pBattleNet = false; CopyChar(tbuff, &pPlayer->pDungMsgs2);
#else pPlayer->pBattleNet = false;
CopyChar(tbuff, &pPlayer->pBattleNet); } else {
#endif pPlayer->pDungMsgs2 = 0;
CopyChar(tbuff, &pPlayer->pBattleNet);
}
CopyChar(tbuff, &pPlayer->pManaShield); CopyChar(tbuff, &pPlayer->pManaShield);
CopyBytes(tbuff, 3, &pPlayer->bReserved); CopyBytes(tbuff, 3, &pPlayer->bReserved);
CopyShort(tbuff, &pPlayer->wReflection); CopyShort(tbuff, &pPlayer->wReflection);
@ -607,19 +615,19 @@ static void LoadQuest(int i)
CopyInt(tbuff, &pQuest->_qty); CopyInt(tbuff, &pQuest->_qty);
CopyChar(tbuff, &pQuest->_qslvl); CopyChar(tbuff, &pQuest->_qslvl);
CopyChar(tbuff, &pQuest->_qidx); CopyChar(tbuff, &pQuest->_qidx);
#ifdef HELLFIRE if (gbIsHellfireSaveGame) {
tbuff += 2; // Alignment tbuff += 2; // Alignment
CopyInt(tbuff, &pQuest->_qmsg); CopyInt(tbuff, &pQuest->_qmsg);
#else } else {
CopyChar(tbuff, &pQuest->_qmsg); BYTE tmp;
#endif CopyChar(tbuff, &tmp);
pQuest->_qmsg = tmp;
}
CopyChar(tbuff, &pQuest->_qvar1); CopyChar(tbuff, &pQuest->_qvar1);
CopyChar(tbuff, &pQuest->_qvar2); CopyChar(tbuff, &pQuest->_qvar2);
#ifdef HELLFIRE
tbuff += 2; // Alignment tbuff += 2; // Alignment
#else if (!gbIsHellfireSaveGame)
tbuff += 3; // Alignment tbuff += 1; // Alignment
#endif
CopyInt(tbuff, &pQuest->_qlog); CopyInt(tbuff, &pQuest->_qlog);
ReturnLvlX = WLoad(); ReturnLvlX = WLoad();
@ -681,21 +689,20 @@ static void LoadPortal(int i)
static bool IsHeaderValid(int magicNumber) static bool IsHeaderValid(int magicNumber)
{ {
if (gbIsSpawn) { gbIsHellfireSaveGame = false;
if (magicNumber != 'SHAR') { if (magicNumber == 'SHAR') {
return false; return true;
} } else if (gbIsHellfire && magicNumber == 'SHLF') {
} else { gbIsHellfireSaveGame = true;
#ifdef HELLFIRE return true;
if (magicNumber != 'HELF') { } else if (!gbIsSpawn && magicNumber == 'RETL') {
#else return true;
if (magicNumber != 'RETL') { } else if (!gbIsSpawn && gbIsHellfire && magicNumber == 'HELF') {
#endif gbIsHellfireSaveGame = true;
return false; return true;
}
} }
return true; return false;
} }
/** /**
@ -719,6 +726,17 @@ void LoadGame(BOOL firstflag)
if (!IsHeaderValid(ILoad())) if (!IsHeaderValid(ILoad()))
app_fatal("Invalid save file"); 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(); setlevel = OLoad();
setlvlnum = WLoad(); setlvlnum = WLoad();
currlevel = WLoad(); currlevel = WLoad();
@ -732,7 +750,7 @@ void LoadGame(BOOL firstflag)
_nummissiles = WLoad(); _nummissiles = WLoad();
_nobjects = WLoad(); _nobjects = WLoad();
for (i = 0; i < NUMLEVELS; i++) { for (i = 0; i < giNumberOfLevels; i++) {
glSeedTbl[i] = ILoad(); glSeedTbl[i] = ILoad();
gnLevelTypeTbl[i] = WLoad(); gnLevelTypeTbl[i] = WLoad();
} }
@ -743,7 +761,7 @@ void LoadGame(BOOL firstflag)
if (gnDifficulty < DIFF_NORMAL || gnDifficulty > DIFF_HELL) if (gnDifficulty < DIFF_NORMAL || gnDifficulty > DIFF_HELL)
gnDifficulty = DIFF_NORMAL; gnDifficulty = DIFF_NORMAL;
for (i = 0; i < MAXQUESTS; i++) for (i = 0; i < giNumberQuests; i++)
LoadQuest(i); LoadQuest(i);
for (i = 0; i < MAXPORTAL; i++) for (i = 0; i < MAXPORTAL; i++)
LoadPortal(i); LoadPortal(i);
@ -856,8 +874,10 @@ void LoadGame(BOOL firstflag)
numpremium = WLoad(); numpremium = WLoad();
premiumlevel = WLoad(); premiumlevel = WLoad();
for (i = 0; i < SMITH_PREMIUM_ITEMS; i++) for (i = 0; i < giNumberOfSmitPremiumItems; i++)
LoadPremium(i); LoadPremium(i);
if (gbIsHellfire && !gbIsHellfireSaveGame)
SpawnPremium(myplr);
automapflag = OLoad(); automapflag = OLoad();
AutoMapScale = WLoad(); AutoMapScale = WLoad();
@ -981,9 +1001,8 @@ static void SaveItem(ItemStruct *pItem)
CopyInt(&pItem->_iStatFlag, tbuff); CopyInt(&pItem->_iStatFlag, tbuff);
CopyInt(&pItem->IDidx, tbuff); CopyInt(&pItem->IDidx, tbuff);
CopyInt(&pItem->offs016C, tbuff); CopyInt(&pItem->offs016C, tbuff);
#ifdef HELLFIRE if (gbIsHellfire)
CopyInt(&pItem->_iDamAcFlags, tbuff); CopyInt(&pItem->_iDamAcFlags, tbuff);
#endif
} }
static void SaveItems(ItemStruct *pItem, const int n) static void SaveItems(ItemStruct *pItem, const int n)
@ -1172,11 +1191,10 @@ static void SavePlayer(int i)
CopyChar(&pPlayer->pTownWarps, tbuff); CopyChar(&pPlayer->pTownWarps, tbuff);
CopyChar(&pPlayer->pDungMsgs, tbuff); CopyChar(&pPlayer->pDungMsgs, tbuff);
CopyChar(&pPlayer->pLvlLoad, tbuff); CopyChar(&pPlayer->pLvlLoad, tbuff);
#ifdef HELLFIRE if (gbIsHellfire)
CopyChar(&pPlayer->pDungMsgs2, tbuff); CopyChar(&pPlayer->pDungMsgs2, tbuff);
#else else
CopyChar(&pPlayer->pBattleNet, tbuff); CopyChar(&pPlayer->pBattleNet, tbuff);
#endif
CopyChar(&pPlayer->pManaShield, tbuff); CopyChar(&pPlayer->pManaShield, tbuff);
CopyChar(&pPlayer->pDungMsgs2, tbuff); CopyChar(&pPlayer->pDungMsgs2, tbuff);
CopyBytes(&pPlayer->bReserved, 2, tbuff); CopyBytes(&pPlayer->bReserved, 2, tbuff);
@ -1404,19 +1422,18 @@ static void SaveQuest(int i)
CopyInt(&pQuest->_qty, tbuff); CopyInt(&pQuest->_qty, tbuff);
CopyChar(&pQuest->_qslvl, tbuff); CopyChar(&pQuest->_qslvl, tbuff);
CopyChar(&pQuest->_qidx, tbuff); CopyChar(&pQuest->_qidx, tbuff);
#ifdef HELLFIRE if (gbIsHellfire) {
tbuff += 2; // Alignment tbuff += 2; // Alignment
CopyInt(&pQuest->_qmsg, tbuff); CopyInt(&pQuest->_qmsg, tbuff);
#else } else {
CopyChar(&pQuest->_qmsg, tbuff); char tmp = pQuest->_qmsg;
#endif CopyChar(&tmp, tbuff);
}
CopyChar(&pQuest->_qvar1, tbuff); CopyChar(&pQuest->_qvar1, tbuff);
CopyChar(&pQuest->_qvar2, tbuff); CopyChar(&pQuest->_qvar2, tbuff);
#ifdef HELLFIRE
tbuff += 2; // Alignment tbuff += 2; // Alignment
#else if (!gbIsHellfire)
tbuff += 3; // Alignment tbuff += 1; // Alignment
#endif
CopyInt(&pQuest->_qlog, tbuff); CopyInt(&pQuest->_qlog, tbuff);
WSave(ReturnLvlX); WSave(ReturnLvlX);
@ -1485,14 +1502,17 @@ void SaveGame()
BYTE *SaveBuff = DiabloAllocPtr(dwLen); BYTE *SaveBuff = DiabloAllocPtr(dwLen);
tbuff = SaveBuff; tbuff = SaveBuff;
if (gbIsSpawn) if (gbIsSpawn && !gbIsHellfire)
ISave('SHAR'); ISave('SHAR');
else else if (gbIsSpawn && gbIsHellfire)
#ifdef HELLFIRE ISave('SHLF');
else if (!gbIsSpawn && gbIsHellfire)
ISave('HELF'); ISave('HELF');
#else else if (!gbIsSpawn && !gbIsHellfire)
ISave('RETL'); ISave('RETL');
#endif else
app_fatal("Invalid game state");
OSave(setlevel); OSave(setlevel);
WSave(setlvlnum); WSave(setlvlnum);
WSave(currlevel); WSave(currlevel);

2
Source/mainmenu.cpp

@ -49,7 +49,7 @@ static BOOL mainmenu_init_menu(int type)
static BOOL mainmenu_single_player() static BOOL mainmenu_single_player()
{ {
#ifdef HELLFIRE #ifdef HELLFIRE
if (!SRegLoadValue(APP_NAME, jogging_title, 0, &jogging_opt)) { if (!SRegLoadValue("Hellfire", jogging_title, 0, &jogging_opt)) {
jogging_opt = TRUE; jogging_opt = TRUE;
} }
#endif #endif

14
defs.h

@ -6,17 +6,9 @@
#ifdef HELLFIRE #ifdef HELLFIRE
#define DIABOOL BOOLEAN #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 && #define HFAND &&
#else #else
#define DIABOOL BOOL
#define HFAND & #define HFAND &
#endif #endif
@ -59,6 +51,7 @@
#define MAXMONSTERS 200 #define MAXMONSTERS 200
#define MAXOBJECTS 127 #define MAXOBJECTS 127
#define MAXPORTAL 4 #define MAXPORTAL 4
#ifdef HELLFIRE #ifdef HELLFIRE
#define MAXQUESTS 24 #define MAXQUESTS 24
#define MAXMULTIQUESTS 10 #define MAXMULTIQUESTS 10
@ -66,13 +59,16 @@
#define MAXQUESTS 16 #define MAXQUESTS 16
#define MAXMULTIQUESTS 4 #define MAXMULTIQUESTS 4
#endif #endif
#define MAXTHEMES 50 #define MAXTHEMES 50
#define MAXTILES 2048 #define MAXTILES 2048
#ifdef HELLFIRE #ifdef HELLFIRE
#define MAXTRIGGERS 7 #define MAXTRIGGERS 7
#else #else
#define MAXTRIGGERS 5 #define MAXTRIGGERS 5
#endif #endif
#define MAXVISION 32 #define MAXVISION 32
#define MDMAXX 40 #define MDMAXX 40
#define MDMAXY 40 #define MDMAXY 40

2
structs.h

@ -171,9 +171,7 @@ typedef struct ItemStruct {
BOOL _iStatFlag; BOOL _iStatFlag;
int IDidx; int IDidx;
int offs016C; // _oldlight or _iInvalid int offs016C; // _oldlight or _iInvalid
#ifdef HELLFIRE
int _iDamAcFlags; int _iDamAcFlags;
#endif
} ItemStruct; } ItemStruct;
////////////////////////////////////////////////// //////////////////////////////////////////////////

Loading…
Cancel
Save