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