diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index 3da407ad0..0c0dd1533 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -390,8 +390,24 @@ void LoadPlayer(LoadHelper &file, Player &player) file.Skip(3); // Alignment player._pSBkSpell = static_cast(file.NextLE()); file.Skip(); // Skip _pSBkSplType - for (uint8_t &spellLevel : player._pSplLvl) - spellLevel = file.NextLE(); + + // Only read spell levels for learnable spells + for (int i = 0; i < static_cast(SpellID::LAST); i++) { + auto spl = static_cast(i); + if (GetSpellData(spl).sBookLvl != -1) + player._pSplLvl[i] = file.NextLE(); + else + file.Skip(); + } + // Skip indices that are unused + for (int i = static_cast(SpellID::LAST); i < 64; i++) + file.Skip(); + // These spells are unavailable in Diablo as learnable spells + if (!gbIsHellfire) { + player._pSplLvl[static_cast(SpellID::Apocalypse)] = 0; + player._pSplLvl[static_cast(SpellID::Nova)] = 0; + } + file.Skip(7); // Alignment player._pMemSpells = file.NextLE(); player._pAblSpells = file.NextLE(); diff --git a/Source/pack.cpp b/Source/pack.cpp index 8a55e3e48..a1ef54322 100644 --- a/Source/pack.cpp +++ b/Source/pack.cpp @@ -484,10 +484,27 @@ void UnPackPlayer(const PlayerPack &packed, Player &player) player._pManaBase = std::min(player._pManaBase, player._pMaxManaBase); player._pMemSpells = SDL_SwapLE64(packed.pMemSpells); - for (int i = 0; i < 37; i++) // Should be MAX_SPELLS but set to 36 to make save games compatible - player._pSplLvl[i] = packed.pSplLvl[i]; - for (int i = 37; i < 47; i++) - player._pSplLvl[i] = packed.pSplLvl2[i - 37]; + // Only read spell levels for learnable spells (Diablo) + for (int i = 0; i < 37; i++) { // Should be MAX_SPELLS but set to 36 to make save games compatible + auto spl = static_cast(i); + if (GetSpellData(spl).sBookLvl != -1) + player._pSplLvl[i] = packed.pSplLvl[i]; + else + player._pSplLvl[i] = 0; + } + // Only read spell levels for learnable spells (Hellfire) + for (int i = 37; i < 47; i++) { + auto spl = static_cast(i); + if (GetSpellData(spl).sBookLvl != -1) + player._pSplLvl[i] = packed.pSplLvl2[i - 37]; + else + player._pSplLvl[i] = 0; + } + // These spells are unavailable in Diablo as learnable spells + if (!gbIsHellfire) { + player._pSplLvl[static_cast(SpellID::Apocalypse)] = 0; + player._pSplLvl[static_cast(SpellID::Nova)] = 0; + } bool isHellfire = packed.bIsHellfire != 0;