From 7b2de562c2d9a580ff1fddbcf3c8d45edcb05b06 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sun, 20 Jul 2025 22:43:52 +0200 Subject: [PATCH] Extract more Hellfire into data --- CMake/Mods.cmake | 1 + Source/DiabloUI/diabloui.cpp | 2 +- Source/gmenu.cpp | 10 ++--- Source/items.cpp | 11 ++--- Source/levels/gendung.cpp | 16 ++++--- Source/loadsave.cpp | 2 +- Source/lua/modules/dev/player/spells.cpp | 2 +- Source/objects.cpp | 7 ++- Source/pack.cpp | 4 +- Source/pack.h | 2 + Source/panels/spell_list.cpp | 6 +-- Source/player.cpp | 2 +- Source/spelldat.h | 2 - Source/spells.cpp | 19 +++------ assets/txtdata/spells/spelldat.tsv | 19 +-------- mods/Hellfire/txtdata/spells/spelldat.tsv | 52 +++++++++++++++++++++++ test/pack_test.cpp | 1 + 17 files changed, 92 insertions(+), 66 deletions(-) create mode 100644 mods/Hellfire/txtdata/spells/spelldat.tsv diff --git a/CMake/Mods.cmake b/CMake/Mods.cmake index a488803fa..d5e4afc7d 100644 --- a/CMake/Mods.cmake +++ b/CMake/Mods.cmake @@ -8,6 +8,7 @@ set(hellfire_mod txtdata/missiles/misdat.tsv txtdata/missiles/missile_sprites.tsv txtdata/monsters/monstdat.tsv + txtdata/spells/spelldat.tsv ui_art/diablo.pal ui_art/hf_titlew.clx ui_art/supportw.clx diff --git a/Source/DiabloUI/diabloui.cpp b/Source/DiabloUI/diabloui.cpp index aa5c9679e..c1bf23c4d 100644 --- a/Source/DiabloUI/diabloui.cpp +++ b/Source/DiabloUI/diabloui.cpp @@ -589,7 +589,7 @@ void LoadHeros() void LoadUiGFX() { - ArtLogo = LoadPcxSpriteList("ui_art\\hf_logo2", /*numFrames=*/16, /*transparentColor=*/0); + ArtLogo = LoadPcxSpriteList("ui_art\\hf_logo2", /*numFrames=*/16, /*transparentColor=*/0, nullptr, false); if (!ArtLogo.has_value()) { ArtLogo = LoadPcxSpriteList("ui_art\\smlogo", /*numFrames=*/15, /*transparentColor=*/250); } diff --git a/Source/gmenu.cpp b/Source/gmenu.cpp index 051d52852..672c87b6f 100644 --- a/Source/gmenu.cpp +++ b/Source/gmenu.cpp @@ -201,9 +201,8 @@ void gmenu_init_menu() if (HeadlessMode) return; - if (gbIsHellfire) - sgpLogo = LoadCel("data\\hf_logo3", 430); - else + sgpLogo = LoadOptionalCel("data\\hf_logo3", 430); + if (!sgpLogo.has_value()) sgpLogo = LoadCel("data\\diabsmal", 296); PentSpin_cel = LoadCel("data\\pentspin", 48); option_cel = LoadCel("data\\option", SliderMarkerWidth); @@ -244,12 +243,11 @@ void gmenu_draw(const Surface &out) GameMenuMove(); if (gmenu_current_option != nullptr) gmenu_current_option(); - if (gbIsHellfire) { + if (sgpLogo->numSprites() > 1) { const uint32_t ticks = SDL_GetTicks(); if ((int)(ticks - LogoAnim_tick) > 25) { ++LogoAnim_frame; - if (LogoAnim_frame >= 16) - LogoAnim_frame = 0; + LogoAnim_frame = LogoAnim_frame % sgpLogo->numSprites(); LogoAnim_tick = ticks; } } diff --git a/Source/items.cpp b/Source/items.cpp index ac970e014..a2a427b89 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -615,9 +615,7 @@ void GetBookSpell(Item &item, int lvl) if (lvl == 0) lvl = 1; - int maxSpells = gbIsHellfire ? MAX_SPELLS : 37; - - rv = GenerateRnd(maxSpells) + 1; + rv = GenerateRnd(SpellsData.size()) + 1; if (gbIsSpawn && lvl > 5) lvl = 5; @@ -639,7 +637,7 @@ void GetBookSpell(Item &item, int lvl) if (s == static_cast(SpellID::HealOther)) s = static_cast(SpellID::BloodStar); } - if (s == maxSpells) + if (static_cast(s) == SpellsData.size()) s = 1; } const std::string_view spellName = GetSpellData(bs).sNameText; @@ -1257,11 +1255,10 @@ void GetStaffSpell(const Player &player, Item &item, int lvl, bool onlygood) return; } - int maxSpells = gbIsHellfire ? MAX_SPELLS : 37; int l = lvl / 2; if (l == 0) l = 1; - int rv = GenerateRnd(maxSpells) + 1; + int rv = GenerateRnd(SpellsData.size()) + 1; if (gbIsSpawn && lvl > 10) lvl = 10; @@ -1279,7 +1276,7 @@ void GetStaffSpell(const Player &player, Item &item, int lvl, bool onlygood) s = static_cast(SpellID::Telekinesis); if (!gbIsMultiplayer && s == static_cast(SpellID::HealOther)) s = static_cast(SpellID::BloodStar); - if (s == maxSpells) + if (static_cast(s) == SpellsData.size()) s = static_cast(SpellID::Firebolt); } diff --git a/Source/levels/gendung.cpp b/Source/levels/gendung.cpp index dbe575f66..c69fcd928 100644 --- a/Source/levels/gendung.cpp +++ b/Source/levels/gendung.cpp @@ -74,10 +74,14 @@ namespace { std::unique_ptr LoadMinData(size_t &tileCount) { switch (leveltype) { - case DTYPE_TOWN: - if (gbIsHellfire) - return LoadFileInMem("nlevels\\towndata\\town.min", &tileCount); - return LoadFileInMem("levels\\towndata\\town.min", &tileCount); + case DTYPE_TOWN: { + auto min = LoadFileInMemWithStatus("nlevels\\towndata\\town.min", &tileCount); + if (!min.has_value()) { + return LoadFileInMem("levels\\towndata\\town.min", &tileCount); + } else { + return std::move(*min); + } + } case DTYPE_CATHEDRAL: return LoadFileInMem("levels\\l1data\\l1.min", &tileCount); case DTYPE_CATACOMBS: @@ -437,9 +441,7 @@ tl::expected LoadLevelSOLData() { switch (leveltype) { case DTYPE_TOWN: - if (gbIsHellfire) { - RETURN_IF_ERROR(LoadFileInMemWithStatus("nlevels\\towndata\\town.sol", SOLData)); - } else { + if (!LoadFileInMemWithStatus("nlevels\\towndata\\town.sol", SOLData).has_value()) { RETURN_IF_ERROR(LoadFileInMemWithStatus("levels\\towndata\\town.sol", SOLData)); } break; diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index a4f645cae..c750c3518 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -419,7 +419,7 @@ void LoadPlayer(LoadHelper &file, Player &player) // 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) + if (GetSpellBookLevel(spl) != -1) player._pSplLvl[i] = file.NextLE(); else file.Skip(); diff --git a/Source/lua/modules/dev/player/spells.cpp b/Source/lua/modules/dev/player/spells.cpp index ab7be2e4e..ae60c40cb 100644 --- a/Source/lua/modules/dev/player/spells.cpp +++ b/Source/lua/modules/dev/player/spells.cpp @@ -16,7 +16,7 @@ namespace devilution { namespace { std::string DebugCmdSetSpellsLevel(uint8_t level) { - for (uint8_t i = static_cast(SpellID::Firebolt); i < MAX_SPELLS; i++) { + for (uint8_t i = static_cast(SpellID::Firebolt); i < SpellsData.size(); i++) { if (GetSpellBookLevel(static_cast(i)) != -1) { NetSendCmdParam2(true, CMD_CHANGE_SPELL_LEVEL, i, level); } diff --git a/Source/objects.cpp b/Source/objects.cpp index 8b5a35dcf..4b0a52afc 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -2437,9 +2437,8 @@ void OperateShrineEnchanted(DiabloGenerator &rng, Player &player) int cnt = 0; uint64_t spell = 1; - uint8_t maxSpells = gbIsHellfire ? MAX_SPELLS : 37; uint64_t spells = player._pMemSpells; - for (uint16_t j = 0; j < maxSpells; j++) { + for (uint16_t j = 0; j < SpellsData.size(); j++) { if ((spell & spells) != 0) cnt++; spell *= 2; @@ -2447,11 +2446,11 @@ void OperateShrineEnchanted(DiabloGenerator &rng, Player &player) if (cnt > 1) { int spellToReduce; do { - spellToReduce = rng.generateRnd(maxSpells) + 1; + spellToReduce = rng.generateRnd(SpellsData.size()) + 1; } while ((player._pMemSpells & GetSpellBitmask(static_cast(spellToReduce))) == 0); spell = 1; - for (uint8_t j = static_cast(SpellID::Firebolt); j < maxSpells; j++) { + for (uint8_t j = static_cast(SpellID::Firebolt); j < SpellsData.size(); j++) { if ((player._pMemSpells & spell) != 0 && player._pSplLvl[j] < MaxSpellLevel && j != spellToReduce) { uint8_t newSpellLevel = static_cast(player._pSplLvl[j] + 1); player._pSplLvl[j] = newSpellLevel; diff --git a/Source/pack.cpp b/Source/pack.cpp index 32dcc12f6..0734e6eb9 100644 --- a/Source/pack.cpp +++ b/Source/pack.cpp @@ -391,7 +391,7 @@ void UnPackPlayer(const PlayerPack &packed, Player &player) // 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) + if (GetSpellBookLevel(spl) != -1) player._pSplLvl[i] = packed.pSplLvl[i]; else player._pSplLvl[i] = 0; @@ -399,7 +399,7 @@ void UnPackPlayer(const PlayerPack &packed, Player &player) // 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) + if (GetSpellBookLevel(spl) != -1) player._pSplLvl[i] = packed.pSplLvl2[i - 37]; else player._pSplLvl[i] = 0; diff --git a/Source/pack.h b/Source/pack.h index 460e2471d..a83fa1c84 100644 --- a/Source/pack.h +++ b/Source/pack.h @@ -14,6 +14,8 @@ namespace devilution { +#define MAX_SPELLS 52 + #pragma pack(push, 1) struct ItemPack { uint32_t iSeed; diff --git a/Source/panels/spell_list.cpp b/Source/panels/spell_list.cpp index 6801edcff..fd25c4c67 100644 --- a/Source/panels/spell_list.cpp +++ b/Source/panels/spell_list.cpp @@ -225,7 +225,7 @@ std::vector GetSpellListItems() continue; } int8_t j = static_cast(SpellID::Firebolt); - for (uint64_t spl = 1; j < MAX_SPELLS; spl <<= 1, j++) { + for (uint64_t spl = 1; static_cast(j) < SpellsData.size(); spl <<= 1, j++) { if ((mask & spl) == 0) continue; int lx = x; @@ -362,9 +362,9 @@ void DoSpeedBook() continue; } uint64_t spell = 1; - for (int j = 1; j < MAX_SPELLS; j++) { + for (size_t j = 1; j < SpellsData.size(); j++) { if ((spell & spells) != 0) { - if (j == static_cast(myPlayer._pRSpell) && static_cast(i) == myPlayer._pRSplType) { + if (j == static_cast(myPlayer._pRSpell) && static_cast(i) == myPlayer._pRSplType) { x = xo + SPLICONLENGTH / 2; y = yo - SPLICONLENGTH / 2; } diff --git a/Source/player.cpp b/Source/player.cpp index e8d479f45..c7bae4877 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -1445,7 +1445,7 @@ void ValidatePlayer() } uint64_t msk = 0; - for (int b = static_cast(SpellID::Firebolt); b < MAX_SPELLS; b++) { + for (size_t b = static_cast(SpellID::Firebolt); b < SpellsData.size(); b++) { if (GetSpellBookLevel((SpellID)b) != -1) { msk |= GetSpellBitmask(static_cast(b)); if (myPlayer._pSplLvl[b] > MaxSpellLevel) diff --git a/Source/spelldat.h b/Source/spelldat.h index df8e3c34d..bba4f4dcf 100644 --- a/Source/spelldat.h +++ b/Source/spelldat.h @@ -18,8 +18,6 @@ namespace devilution { -#define MAX_SPELLS 52 - enum class SpellType : uint8_t { Skill, FIRST = Skill, diff --git a/Source/spells.cpp b/Source/spells.cpp index 7f4435578..a886db759 100644 --- a/Source/spells.cpp +++ b/Source/spells.cpp @@ -71,9 +71,7 @@ void ClearReadiedSpell(Player &player) bool IsValidSpell(SpellID spl) { - return spl > SpellID::Null - && spl <= SpellID::LAST - && (spl <= SpellID::LastDiablo || gbIsHellfire); + return spl > SpellID::Null && static_cast(spl) < SpellsData.size(); } bool IsValidSpellFrom(int spellFrom) @@ -318,16 +316,8 @@ int GetSpellBookLevel(SpellID s) } } - if (!gbIsHellfire) { - switch (s) { - case SpellID::Nova: - case SpellID::Apocalypse: - return -1; - default: - if (s > SpellID::LastDiablo) - return -1; - break; - } + if (static_cast(s) >= SpellsData.size()) { + return -1; } return GetSpellData(s).sBookLvl; @@ -350,8 +340,9 @@ int GetSpellStaffLevel(SpellID s) } } - if (!gbIsHellfire && s > SpellID::LastDiablo) + if (static_cast(s) >= SpellsData.size()) { return -1; + } return GetSpellData(s).sStaffLvl; } diff --git a/assets/txtdata/spells/spelldat.tsv b/assets/txtdata/spells/spelldat.tsv index 5f135d211..04244267a 100644 --- a/assets/txtdata/spells/spelldat.tsv +++ b/assets/txtdata/spells/spelldat.tsv @@ -16,13 +16,13 @@ ChainLightning Chain Lightning CastFire 1100 75 30 Lightning 8 7 54 ChainLightni FlameWave Flame Wave CastFire 1000 65 35 Fire,Targeted 9 8 54 FlameWaveControl 3 20 20 40 DoomSerpents Doom Serpents CastFire 0 0 0 Lightning -1 -1 0 0 0 40 80 BloodRitual Blood Ritual CastFire 0 0 0 Magic -1 -1 0 0 0 40 80 -Nova Nova CastLightning 2100 130 60 Magic 14 10 87 Nova 3 35 16 32 +Nova Nova CastLightning 2100 130 60 Magic -1 10 87 Nova 3 35 16 32 Invisibility Invisibility CastFire 0 0 0 Magic -1 -1 0 0 0 40 80 Inferno Inferno CastFire 200 10 11 Fire,Targeted 3 2 20 InfernoControl 1 6 20 40 Golem Golem CastFire 1800 110 100 Fire,Targeted 11 9 81 Golem 6 60 16 32 Rage Rage CastHealing 0 0 15 Magic -1 -1 0 Rage 1 1 0 0 Teleport Teleport CastSkill 2000 125 35 Magic,Targeted 14 12 105 Teleport 3 15 16 32 -Apocalypse Apocalypse CastFire 3000 200 150 Fire 19 15 149 Apocalypse 6 90 8 12 +Apocalypse Apocalypse CastFire 3000 200 150 Fire -1 15 149 Apocalypse 6 90 8 12 Etherealize Etherealize CastFire 2600 160 100 Magic -1 -1 93 Etherealize 0 100 2 6 ItemRepair Item Repair CastSkill 0 0 0 Magic,AllowedInTown -1 -1 255 ItemRepair 0 0 40 80 StaffRecharge Staff Recharge CastSkill 0 0 0 Magic,AllowedInTown -1 -1 255 StaffRecharge 0 0 40 80 @@ -35,18 +35,3 @@ Telekinesis Telekinesis CastFire 250 20 15 Magic 2 2 33 Telekinesis 2 8 20 40 HealOther Heal Other CastHealing 100 5 5 Magic,AllowedInTown 1 1 17 HealOther 3 1 20 40 BloodStar Blood Star CastFire 2750 180 25 Magic 14 13 70 BloodStar 2 14 20 60 BoneSpirit Bone Spirit CastFire 1150 80 24 Magic 9 7 34 BoneSpirit 1 12 20 60 -Mana Mana CastHealing 100 5 255 Magic,AllowedInTown -1 5 17 Mana 3 1 12 24 -Magi the Magi CastHealing 10000 20 255 Magic,AllowedInTown -1 20 45 Magi 3 1 15 30 -Jester the Jester CastHealing 10000 20 255 Magic,Targeted -1 4 30 Jester 3 1 15 30 -LightningWall Lightning Wall CastLightning 600 40 28 Lightning,Targeted 3 2 27 LightningWallControl 2 16 8 16 -Immolation Immolation CastFire 2100 130 60 Fire 14 10 87 Immolation 3 35 16 32 -Warp Warp CastSkill 300 20 35 Magic 3 3 25 Warp 3 18 8 12 -Reflect Reflect CastSkill 300 20 35 Magic 3 3 25 Reflect 3 15 8 12 -Berserk Berserk CastSkill 300 20 35 Magic,Targeted 3 3 35 Berserk 3 15 8 12 -RingOfFire Ring of Fire CastFire 600 40 28 Fire 5 5 27 RingOfFire 2 16 8 16 -Search Search CastSkill 300 20 15 Magic 1 3 25 Search 1 1 8 12 -RuneOfFire Rune of Fire CastHealing 800 30 255 Magic,Targeted -1 -1 48 RuneOfFire 1 10 40 80 -RuneOfLight Rune of Light CastHealing 800 30 255 Magic,Targeted -1 -1 48 RuneOfLight 1 10 40 80 -RuneOfNova Rune of Nova CastHealing 800 30 255 Magic,Targeted -1 -1 48 RuneOfNova 1 10 40 80 -RuneOfImmolation Rune of Immolation CastHealing 800 30 255 Magic,Targeted -1 -1 48 RuneOfImmolation 1 10 40 80 -RuneOfStone Rune of Stone CastHealing 800 30 255 Magic,Targeted -1 -1 48 RuneOfStone 1 10 40 80 diff --git a/mods/Hellfire/txtdata/spells/spelldat.tsv b/mods/Hellfire/txtdata/spells/spelldat.tsv new file mode 100644 index 000000000..5f135d211 --- /dev/null +++ b/mods/Hellfire/txtdata/spells/spelldat.tsv @@ -0,0 +1,52 @@ +id name soundId bookCost10 staffCost10 manaCost flags bookLevel staffLevel minIntelligence missiles manaMultiplier minMana staffMin staffMax +Firebolt Firebolt CastFire 100 5 6 Fire,Targeted 1 1 15 Firebolt 1 3 40 80 +Healing Healing CastHealing 100 5 5 Magic,AllowedInTown 1 1 17 Healing 3 1 20 40 +Lightning Lightning CastLightning 300 15 10 Lightning,Targeted 4 3 20 LightningControl 1 6 20 60 +Flash Flash CastLightning 750 50 30 Lightning 5 4 33 FlashBottom,FlashTop 2 16 20 40 +Identify Identify CastSkill 0 10 13 Magic,AllowedInTown -1 -1 23 Identify 2 1 8 12 +FireWall Fire Wall CastFire 600 40 28 Fire,Targeted 3 2 27 FireWallControl 2 16 8 16 +TownPortal Town Portal CastSkill 300 20 35 Magic,Targeted 3 3 20 TownPortal 3 18 8 12 +StoneCurse Stone Curse CastFire 1200 80 60 Magic,Targeted 6 5 51 StoneCurse 3 40 8 16 +Infravision Infravision CastHealing 0 60 40 Magic -1 -1 36 Infravision 5 20 0 0 +Phasing Phasing CastFire 350 20 12 Magic 7 6 39 Phasing 2 4 40 80 +ManaShield Mana Shield CastFire 1600 120 33 Magic 6 5 25 ManaShield 0 33 4 10 +Fireball Fireball CastFire 800 30 16 Fire,Targeted 8 7 48 Fireball 1 10 40 80 +Guardian Guardian CastFire 1400 95 50 Fire,Targeted 9 8 61 Guardian 2 30 16 32 +ChainLightning Chain Lightning CastFire 1100 75 30 Lightning 8 7 54 ChainLightning 1 18 20 60 +FlameWave Flame Wave CastFire 1000 65 35 Fire,Targeted 9 8 54 FlameWaveControl 3 20 20 40 +DoomSerpents Doom Serpents CastFire 0 0 0 Lightning -1 -1 0 0 0 40 80 +BloodRitual Blood Ritual CastFire 0 0 0 Magic -1 -1 0 0 0 40 80 +Nova Nova CastLightning 2100 130 60 Magic 14 10 87 Nova 3 35 16 32 +Invisibility Invisibility CastFire 0 0 0 Magic -1 -1 0 0 0 40 80 +Inferno Inferno CastFire 200 10 11 Fire,Targeted 3 2 20 InfernoControl 1 6 20 40 +Golem Golem CastFire 1800 110 100 Fire,Targeted 11 9 81 Golem 6 60 16 32 +Rage Rage CastHealing 0 0 15 Magic -1 -1 0 Rage 1 1 0 0 +Teleport Teleport CastSkill 2000 125 35 Magic,Targeted 14 12 105 Teleport 3 15 16 32 +Apocalypse Apocalypse CastFire 3000 200 150 Fire 19 15 149 Apocalypse 6 90 8 12 +Etherealize Etherealize CastFire 2600 160 100 Magic -1 -1 93 Etherealize 0 100 2 6 +ItemRepair Item Repair CastSkill 0 0 0 Magic,AllowedInTown -1 -1 255 ItemRepair 0 0 40 80 +StaffRecharge Staff Recharge CastSkill 0 0 0 Magic,AllowedInTown -1 -1 255 StaffRecharge 0 0 40 80 +TrapDisarm Trap Disarm CastSkill 0 0 0 Magic -1 -1 255 TrapDisarm 0 0 40 80 +Elemental Elemental CastFire 1050 70 35 Fire 8 6 68 Elemental 2 20 20 60 +ChargedBolt Charged Bolt CastFire 100 5 6 Lightning,Targeted 1 1 25 ChargedBolt 1 6 40 80 +HolyBolt Holy Bolt CastFire 100 5 7 Magic,Targeted 1 1 20 HolyBolt 1 3 40 80 +Resurrect Resurrect CastHealing 400 25 20 Magic,AllowedInTown -1 5 30 Resurrect 0 20 4 10 +Telekinesis Telekinesis CastFire 250 20 15 Magic 2 2 33 Telekinesis 2 8 20 40 +HealOther Heal Other CastHealing 100 5 5 Magic,AllowedInTown 1 1 17 HealOther 3 1 20 40 +BloodStar Blood Star CastFire 2750 180 25 Magic 14 13 70 BloodStar 2 14 20 60 +BoneSpirit Bone Spirit CastFire 1150 80 24 Magic 9 7 34 BoneSpirit 1 12 20 60 +Mana Mana CastHealing 100 5 255 Magic,AllowedInTown -1 5 17 Mana 3 1 12 24 +Magi the Magi CastHealing 10000 20 255 Magic,AllowedInTown -1 20 45 Magi 3 1 15 30 +Jester the Jester CastHealing 10000 20 255 Magic,Targeted -1 4 30 Jester 3 1 15 30 +LightningWall Lightning Wall CastLightning 600 40 28 Lightning,Targeted 3 2 27 LightningWallControl 2 16 8 16 +Immolation Immolation CastFire 2100 130 60 Fire 14 10 87 Immolation 3 35 16 32 +Warp Warp CastSkill 300 20 35 Magic 3 3 25 Warp 3 18 8 12 +Reflect Reflect CastSkill 300 20 35 Magic 3 3 25 Reflect 3 15 8 12 +Berserk Berserk CastSkill 300 20 35 Magic,Targeted 3 3 35 Berserk 3 15 8 12 +RingOfFire Ring of Fire CastFire 600 40 28 Fire 5 5 27 RingOfFire 2 16 8 16 +Search Search CastSkill 300 20 15 Magic 1 3 25 Search 1 1 8 12 +RuneOfFire Rune of Fire CastHealing 800 30 255 Magic,Targeted -1 -1 48 RuneOfFire 1 10 40 80 +RuneOfLight Rune of Light CastHealing 800 30 255 Magic,Targeted -1 -1 48 RuneOfLight 1 10 40 80 +RuneOfNova Rune of Nova CastHealing 800 30 255 Magic,Targeted -1 -1 48 RuneOfNova 1 10 40 80 +RuneOfImmolation Rune of Immolation CastHealing 800 30 255 Magic,Targeted -1 -1 48 RuneOfImmolation 1 10 40 80 +RuneOfStone Rune of Stone CastHealing 800 30 255 Magic,Targeted -1 -1 48 RuneOfStone 1 10 40 80 diff --git a/test/pack_test.cpp b/test/pack_test.cpp index 80f2353b5..7f16db153 100644 --- a/test/pack_test.cpp +++ b/test/pack_test.cpp @@ -61,6 +61,7 @@ void SetHellfireState(bool enable) LoadModArchives({ { "Hellfire" } }); } LoadItemData(); + LoadSpellData(); } void ComparePackedItems(const ItemPack &item1LE, const ItemPack &item2LE)