Browse Source

Extract more Hellfire into data

pull/8079/head
Anders Jenbo 8 months ago
parent
commit
7b2de562c2
  1. 1
      CMake/Mods.cmake
  2. 2
      Source/DiabloUI/diabloui.cpp
  3. 10
      Source/gmenu.cpp
  4. 11
      Source/items.cpp
  5. 16
      Source/levels/gendung.cpp
  6. 2
      Source/loadsave.cpp
  7. 2
      Source/lua/modules/dev/player/spells.cpp
  8. 7
      Source/objects.cpp
  9. 4
      Source/pack.cpp
  10. 2
      Source/pack.h
  11. 6
      Source/panels/spell_list.cpp
  12. 2
      Source/player.cpp
  13. 2
      Source/spelldat.h
  14. 19
      Source/spells.cpp
  15. 19
      assets/txtdata/spells/spelldat.tsv
  16. 52
      mods/Hellfire/txtdata/spells/spelldat.tsv
  17. 1
      test/pack_test.cpp

1
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

2
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);
}

10
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;
}
}

11
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<int8_t>(SpellID::HealOther))
s = static_cast<int8_t>(SpellID::BloodStar);
}
if (s == maxSpells)
if (static_cast<size_t>(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<int8_t>(SpellID::Telekinesis);
if (!gbIsMultiplayer && s == static_cast<int8_t>(SpellID::HealOther))
s = static_cast<int8_t>(SpellID::BloodStar);
if (s == maxSpells)
if (static_cast<size_t>(s) == SpellsData.size())
s = static_cast<int8_t>(SpellID::Firebolt);
}

16
Source/levels/gendung.cpp

@ -74,10 +74,14 @@ namespace {
std::unique_ptr<uint16_t[]> LoadMinData(size_t &tileCount)
{
switch (leveltype) {
case DTYPE_TOWN:
if (gbIsHellfire)
return LoadFileInMem<uint16_t>("nlevels\\towndata\\town.min", &tileCount);
return LoadFileInMem<uint16_t>("levels\\towndata\\town.min", &tileCount);
case DTYPE_TOWN: {
auto min = LoadFileInMemWithStatus<uint16_t>("nlevels\\towndata\\town.min", &tileCount);
if (!min.has_value()) {
return LoadFileInMem<uint16_t>("levels\\towndata\\town.min", &tileCount);
} else {
return std::move(*min);
}
}
case DTYPE_CATHEDRAL:
return LoadFileInMem<uint16_t>("levels\\l1data\\l1.min", &tileCount);
case DTYPE_CATACOMBS:
@ -437,9 +441,7 @@ tl::expected<void, std::string> 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;

2
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<int>(SpellID::LAST); i++) {
auto spl = static_cast<SpellID>(i);
if (GetSpellData(spl).sBookLvl != -1)
if (GetSpellBookLevel(spl) != -1)
player._pSplLvl[i] = file.NextLE<uint8_t>();
else
file.Skip<uint8_t>();

2
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<uint8_t>(SpellID::Firebolt); i < MAX_SPELLS; i++) {
for (uint8_t i = static_cast<uint8_t>(SpellID::Firebolt); i < SpellsData.size(); i++) {
if (GetSpellBookLevel(static_cast<SpellID>(i)) != -1) {
NetSendCmdParam2(true, CMD_CHANGE_SPELL_LEVEL, i, level);
}

7
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<SpellID>(spellToReduce))) == 0);
spell = 1;
for (uint8_t j = static_cast<uint8_t>(SpellID::Firebolt); j < maxSpells; j++) {
for (uint8_t j = static_cast<uint8_t>(SpellID::Firebolt); j < SpellsData.size(); j++) {
if ((player._pMemSpells & spell) != 0 && player._pSplLvl[j] < MaxSpellLevel && j != spellToReduce) {
uint8_t newSpellLevel = static_cast<uint8_t>(player._pSplLvl[j] + 1);
player._pSplLvl[j] = newSpellLevel;

4
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<SpellID>(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<SpellID>(i);
if (GetSpellData(spl).sBookLvl != -1)
if (GetSpellBookLevel(spl) != -1)
player._pSplLvl[i] = packed.pSplLvl2[i - 37];
else
player._pSplLvl[i] = 0;

2
Source/pack.h

@ -14,6 +14,8 @@
namespace devilution {
#define MAX_SPELLS 52
#pragma pack(push, 1)
struct ItemPack {
uint32_t iSeed;

6
Source/panels/spell_list.cpp

@ -225,7 +225,7 @@ std::vector<SpellListItem> GetSpellListItems()
continue;
}
int8_t j = static_cast<int8_t>(SpellID::Firebolt);
for (uint64_t spl = 1; j < MAX_SPELLS; spl <<= 1, j++) {
for (uint64_t spl = 1; static_cast<size_t>(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<int8_t>(myPlayer._pRSpell) && static_cast<SpellType>(i) == myPlayer._pRSplType) {
if (j == static_cast<size_t>(myPlayer._pRSpell) && static_cast<SpellType>(i) == myPlayer._pRSplType) {
x = xo + SPLICONLENGTH / 2;
y = yo - SPLICONLENGTH / 2;
}

2
Source/player.cpp

@ -1445,7 +1445,7 @@ void ValidatePlayer()
}
uint64_t msk = 0;
for (int b = static_cast<int8_t>(SpellID::Firebolt); b < MAX_SPELLS; b++) {
for (size_t b = static_cast<size_t>(SpellID::Firebolt); b < SpellsData.size(); b++) {
if (GetSpellBookLevel((SpellID)b) != -1) {
msk |= GetSpellBitmask(static_cast<SpellID>(b));
if (myPlayer._pSplLvl[b] > MaxSpellLevel)

2
Source/spelldat.h

@ -18,8 +18,6 @@
namespace devilution {
#define MAX_SPELLS 52
enum class SpellType : uint8_t {
Skill,
FIRST = Skill,

19
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<size_t>(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<uint8_t>(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<uint8_t>(s) >= SpellsData.size()) {
return -1;
}
return GetSpellData(s).sStaffLvl;
}

19
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

1 id name soundId bookCost10 staffCost10 manaCost flags bookLevel staffLevel minIntelligence missiles manaMultiplier minMana staffMin staffMax
16 FlameWave Flame Wave CastFire 1000 65 35 Fire,Targeted 9 8 54 FlameWaveControl 3 20 20 40
17 DoomSerpents Doom Serpents CastFire 0 0 0 Lightning -1 -1 0 0 0 40 80
18 BloodRitual Blood Ritual CastFire 0 0 0 Magic -1 -1 0 0 0 40 80
19 Nova Nova CastLightning 2100 130 60 Magic 14 -1 10 87 Nova 3 35 16 32
20 Invisibility Invisibility CastFire 0 0 0 Magic -1 -1 0 0 0 40 80
21 Inferno Inferno CastFire 200 10 11 Fire,Targeted 3 2 20 InfernoControl 1 6 20 40
22 Golem Golem CastFire 1800 110 100 Fire,Targeted 11 9 81 Golem 6 60 16 32
23 Rage Rage CastHealing 0 0 15 Magic -1 -1 0 Rage 1 1 0 0
24 Teleport Teleport CastSkill 2000 125 35 Magic,Targeted 14 12 105 Teleport 3 15 16 32
25 Apocalypse Apocalypse CastFire 3000 200 150 Fire 19 -1 15 149 Apocalypse 6 90 8 12
26 Etherealize Etherealize CastFire 2600 160 100 Magic -1 -1 93 Etherealize 0 100 2 6
27 ItemRepair Item Repair CastSkill 0 0 0 Magic,AllowedInTown -1 -1 255 ItemRepair 0 0 40 80
28 StaffRecharge Staff Recharge CastSkill 0 0 0 Magic,AllowedInTown -1 -1 255 StaffRecharge 0 0 40 80
35 HealOther Heal Other CastHealing 100 5 5 Magic,AllowedInTown 1 1 17 HealOther 3 1 20 40
36 BloodStar Blood Star CastFire 2750 180 25 Magic 14 13 70 BloodStar 2 14 20 60
37 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

52
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
1 id name soundId bookCost10 staffCost10 manaCost flags bookLevel staffLevel minIntelligence missiles manaMultiplier minMana staffMin staffMax
2 Firebolt Firebolt CastFire 100 5 6 Fire,Targeted 1 1 15 Firebolt 1 3 40 80
3 Healing Healing CastHealing 100 5 5 Magic,AllowedInTown 1 1 17 Healing 3 1 20 40
4 Lightning Lightning CastLightning 300 15 10 Lightning,Targeted 4 3 20 LightningControl 1 6 20 60
5 Flash Flash CastLightning 750 50 30 Lightning 5 4 33 FlashBottom,FlashTop 2 16 20 40
6 Identify Identify CastSkill 0 10 13 Magic,AllowedInTown -1 -1 23 Identify 2 1 8 12
7 FireWall Fire Wall CastFire 600 40 28 Fire,Targeted 3 2 27 FireWallControl 2 16 8 16
8 TownPortal Town Portal CastSkill 300 20 35 Magic,Targeted 3 3 20 TownPortal 3 18 8 12
9 StoneCurse Stone Curse CastFire 1200 80 60 Magic,Targeted 6 5 51 StoneCurse 3 40 8 16
10 Infravision Infravision CastHealing 0 60 40 Magic -1 -1 36 Infravision 5 20 0 0
11 Phasing Phasing CastFire 350 20 12 Magic 7 6 39 Phasing 2 4 40 80
12 ManaShield Mana Shield CastFire 1600 120 33 Magic 6 5 25 ManaShield 0 33 4 10
13 Fireball Fireball CastFire 800 30 16 Fire,Targeted 8 7 48 Fireball 1 10 40 80
14 Guardian Guardian CastFire 1400 95 50 Fire,Targeted 9 8 61 Guardian 2 30 16 32
15 ChainLightning Chain Lightning CastFire 1100 75 30 Lightning 8 7 54 ChainLightning 1 18 20 60
16 FlameWave Flame Wave CastFire 1000 65 35 Fire,Targeted 9 8 54 FlameWaveControl 3 20 20 40
17 DoomSerpents Doom Serpents CastFire 0 0 0 Lightning -1 -1 0 0 0 40 80
18 BloodRitual Blood Ritual CastFire 0 0 0 Magic -1 -1 0 0 0 40 80
19 Nova Nova CastLightning 2100 130 60 Magic 14 10 87 Nova 3 35 16 32
20 Invisibility Invisibility CastFire 0 0 0 Magic -1 -1 0 0 0 40 80
21 Inferno Inferno CastFire 200 10 11 Fire,Targeted 3 2 20 InfernoControl 1 6 20 40
22 Golem Golem CastFire 1800 110 100 Fire,Targeted 11 9 81 Golem 6 60 16 32
23 Rage Rage CastHealing 0 0 15 Magic -1 -1 0 Rage 1 1 0 0
24 Teleport Teleport CastSkill 2000 125 35 Magic,Targeted 14 12 105 Teleport 3 15 16 32
25 Apocalypse Apocalypse CastFire 3000 200 150 Fire 19 15 149 Apocalypse 6 90 8 12
26 Etherealize Etherealize CastFire 2600 160 100 Magic -1 -1 93 Etherealize 0 100 2 6
27 ItemRepair Item Repair CastSkill 0 0 0 Magic,AllowedInTown -1 -1 255 ItemRepair 0 0 40 80
28 StaffRecharge Staff Recharge CastSkill 0 0 0 Magic,AllowedInTown -1 -1 255 StaffRecharge 0 0 40 80
29 TrapDisarm Trap Disarm CastSkill 0 0 0 Magic -1 -1 255 TrapDisarm 0 0 40 80
30 Elemental Elemental CastFire 1050 70 35 Fire 8 6 68 Elemental 2 20 20 60
31 ChargedBolt Charged Bolt CastFire 100 5 6 Lightning,Targeted 1 1 25 ChargedBolt 1 6 40 80
32 HolyBolt Holy Bolt CastFire 100 5 7 Magic,Targeted 1 1 20 HolyBolt 1 3 40 80
33 Resurrect Resurrect CastHealing 400 25 20 Magic,AllowedInTown -1 5 30 Resurrect 0 20 4 10
34 Telekinesis Telekinesis CastFire 250 20 15 Magic 2 2 33 Telekinesis 2 8 20 40
35 HealOther Heal Other CastHealing 100 5 5 Magic,AllowedInTown 1 1 17 HealOther 3 1 20 40
36 BloodStar Blood Star CastFire 2750 180 25 Magic 14 13 70 BloodStar 2 14 20 60
37 BoneSpirit Bone Spirit CastFire 1150 80 24 Magic 9 7 34 BoneSpirit 1 12 20 60
38 Mana Mana CastHealing 100 5 255 Magic,AllowedInTown -1 5 17 Mana 3 1 12 24
39 Magi the Magi CastHealing 10000 20 255 Magic,AllowedInTown -1 20 45 Magi 3 1 15 30
40 Jester the Jester CastHealing 10000 20 255 Magic,Targeted -1 4 30 Jester 3 1 15 30
41 LightningWall Lightning Wall CastLightning 600 40 28 Lightning,Targeted 3 2 27 LightningWallControl 2 16 8 16
42 Immolation Immolation CastFire 2100 130 60 Fire 14 10 87 Immolation 3 35 16 32
43 Warp Warp CastSkill 300 20 35 Magic 3 3 25 Warp 3 18 8 12
44 Reflect Reflect CastSkill 300 20 35 Magic 3 3 25 Reflect 3 15 8 12
45 Berserk Berserk CastSkill 300 20 35 Magic,Targeted 3 3 35 Berserk 3 15 8 12
46 RingOfFire Ring of Fire CastFire 600 40 28 Fire 5 5 27 RingOfFire 2 16 8 16
47 Search Search CastSkill 300 20 15 Magic 1 3 25 Search 1 1 8 12
48 RuneOfFire Rune of Fire CastHealing 800 30 255 Magic,Targeted -1 -1 48 RuneOfFire 1 10 40 80
49 RuneOfLight Rune of Light CastHealing 800 30 255 Magic,Targeted -1 -1 48 RuneOfLight 1 10 40 80
50 RuneOfNova Rune of Nova CastHealing 800 30 255 Magic,Targeted -1 -1 48 RuneOfNova 1 10 40 80
51 RuneOfImmolation Rune of Immolation CastHealing 800 30 255 Magic,Targeted -1 -1 48 RuneOfImmolation 1 10 40 80
52 RuneOfStone Rune of Stone CastHealing 800 30 255 Magic,Targeted -1 -1 48 RuneOfStone 1 10 40 80

1
test/pack_test.cpp

@ -61,6 +61,7 @@ void SetHellfireState(bool enable)
LoadModArchives({ { "Hellfire" } });
}
LoadItemData();
LoadSpellData();
}
void ComparePackedItems(const ItemPack &item1LE, const ItemPack &item2LE)

Loading…
Cancel
Save