[Hide Content]From e2b64aaa867f781f9fd66cc19000dcfab3a89969 Mon Sep 17 00:00:00 2001
From: Roberto <roberto.tomas.cuentas@gmail.com>
Date: Thu, 2 Sep 2010 22:16:11 -0400
Subject: [PATCH 12/12] deep dwarf berserker monsters
---
crawl-ref/source/enum.h | 7 +++
crawl-ref/source/main.cc | 2 +-
crawl-ref/source/mon-abil.cc | 4 +-
crawl-ref/source/mon-act.cc | 5 ++-
crawl-ref/source/mon-cast.cc | 106 ++++++++++++++++++++++++++++++++++++++++--
crawl-ref/source/mon-data.h | 22 +++++++--
crawl-ref/source/mon-gear.cc | 16 +++++--
crawl-ref/source/mon-info.cc | 4 ++
crawl-ref/source/mon-info.h | 2 +
crawl-ref/source/mon-spll.h | 11 ++++
crawl-ref/source/mon-util.cc | 5 ++
crawl-ref/source/monster.cc | 5 ++-
crawl-ref/source/spl-data.h | 39 +++++++++++++++
13 files changed, 210 insertions(+), 18 deletions(-)
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index bcd0f47..67a731b 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -1293,6 +1293,8 @@ enum enchant_type
ENCH_EXPLODING,
ENCH_BLEED,
ENCH_ANTIMAGIC,
+ ENCH_REGENERATION,
+ ENCH_RAISED_MR,
// Update enchantment names in monster.cc when adding or removing
// enchantments.
@@ -2161,6 +2163,7 @@ enum monster_type // (int) menv[].type
// Dwarf Hall monsters
MONS_NISSE,
MONS_DEEP_DWARF,
+ MONS_DEEP_DWARF_BERSERKER,
MONS_DEEP_DWARF_NECROMANCER,
MONS_DEEP_DWARF_ARTIFICER,
MONS_WITCH,
@@ -2314,6 +2317,7 @@ enum mon_spellbook_type
MST_ORC_WIZARD_II,
MST_ORC_WIZARD_III,
MST_NISSE,
+ MST_DEEP_DWARF_BERSERKER,
MST_DEEP_DWARF_NECROMANCER,
MST_GUARDIAN_SERPENT = 10,
MST_LICH_I = 20,
@@ -3053,6 +3057,9 @@ enum spell_type
SPELL_AWAKEN_FOREST,
SPELL_SUMMON_CANIFORMS,
SPELL_IRON_ELEMENTALS,
+ SPELL_BURN_SPELLBOOK,
+ SPELL_TROGS_HAND,
+ SPELL_BROTHERS_IN_ARMS,
NUM_SPELLS
};
diff --git a/crawl-ref/source/main.cc b/crawl-ref/source/main.cc
index 8cb4f38..baba68a 100644
--- a/crawl-ref/source/main.cc
+++ b/crawl-ref/source/main.cc
@@ -4084,7 +4084,7 @@ static void _compile_time_asserts()
COMPILE_CHECK(SP_VAMPIRE == 30 , c3);
COMPILE_CHECK(SPELL_DEBUGGING_RAY == 102 , c4);
COMPILE_CHECK(SPELL_PETRIFY == 154 , c5);
- COMPILE_CHECK(NUM_SPELLS == 204 , c6);
+ COMPILE_CHECK(NUM_SPELLS == 207 , c6);
//jmf: NEW ASSERTS: we ought to do a *lot* of these
COMPILE_CHECK(NUM_SPECIES < SP_UNKNOWN , c7);
diff --git a/crawl-ref/source/mon-abil.cc b/crawl-ref/source/mon-abil.cc
index 7a1477c..f9ecbb6 100644
--- a/crawl-ref/source/mon-abil.cc
+++ b/crawl-ref/source/mon-abil.cc
@@ -780,6 +780,7 @@ static bool _slime_split_merge(monsters *thing)
}
// Returns true if you resist the siren's call.
+// -- added equivalency for huldra
static bool _siren_movement_effect(const monsters *monster)
{
bool do_resist = (you.attribute[ATTR_HELD] || you.check_res_magic(70)
@@ -2123,6 +2124,7 @@ bool mon_special_ability(monsters *monster, bolt & beem)
}
break;
+ case MONS_HULDRA:
case MONS_MERMAID:
case MONS_SIREN:
{
@@ -2185,7 +2187,7 @@ bool mon_special_ability(monsters *monster, bolt & beem)
already_mesmerised ? "her luring" : "a haunting").c_str(),
spl);
- if (monster->type == MONS_SIREN)
+ if ((monster->type == MONS_SIREN) || (monster->type == MONS_HULDRA))
{
if (_siren_movement_effect(monster))
{
diff --git a/crawl-ref/source/mon-act.cc b/crawl-ref/source/mon-act.cc
index df590e6..a0d466f 100644
--- a/crawl-ref/source/mon-act.cc
+++ b/crawl-ref/source/mon-act.cc
@@ -91,7 +91,8 @@ static inline bool _mons_natural_regen_roll(monsters *monster)
// Do natural regeneration for monster.
static void _monster_regenerate(monsters *monster)
{
- if (monster->has_ench(ENCH_SICK) || !mons_can_regenerate(monster))
+ if ( monster->has_ench(ENCH_SICK) ||
+ (!mons_can_regenerate(monster) && !(monster->has_ench(ENCH_REGENERATION))) )
return;
// Non-land creatures out of their element cannot regenerate.
@@ -113,6 +114,8 @@ static void _monster_regenerate(monsters *monster)
&& env.cgrid(monster->pos()) == EMPTY_CLOUD
&& one_chance_in(3))
+ || monster->has_ench(ENCH_REGENERATION)
+
|| _mons_natural_regen_roll(monster))
{
monster->heal(1);
diff --git a/crawl-ref/source/mon-cast.cc b/crawl-ref/source/mon-cast.cc
index 736c6b1..cea4bad 100644
--- a/crawl-ref/source/mon-cast.cc
+++ b/crawl-ref/source/mon-cast.cc
@@ -37,6 +37,7 @@
#include "random.h"
#include "religion.h"
#include "shout.h"
+#include "spl-book.h"
#include "spl-util.h"
#include "spl-cast.h"
#include "spl-clouds.h"
@@ -217,9 +218,13 @@ bolt mons_spells( monsters *mons, spell_type spell_cast, int power,
beam.is_beam = false;
beam.is_explosion = false;
- // Sandblast is different, and gets range updated later
- if (spell_cast != SPELL_SANDBLAST)
+ switch (spell_cast)
+ { // add touch or range-setting spells here
+ case SPELL_SANDBLAST:
+ break;
+ default:
beam.range = spell_range(spell_cast, power, true, false);
+ }
const int drac_type = (mons_genus(mons->type) == MONS_DRACONIAN)
? draco_subspecies(mons) : mons->type;
@@ -844,8 +849,8 @@ bool setup_mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast,
switch (spell_cast)
{
case SPELL_SUMMON_SMALL_MAMMALS:
- case SPELL_MAJOR_HEALING:
case SPELL_VAMPIRIC_DRAINING:
+ case SPELL_MAJOR_HEALING:
case SPELL_VAMPIRE_SUMMON:
case SPELL_SHADOW_CREATURES: // summon anything appropriate for level
case SPELL_FAKE_RAKSHASA_SUMMON:
@@ -870,7 +875,10 @@ bool setup_mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast,
case SPELL_SYMBOL_OF_TORMENT:
case SPELL_SUMMON_GREATER_DEMON:
case SPELL_CANTRIP:
+ case SPELL_BROTHERS_IN_ARMS:
case SPELL_BERSERKER_RAGE:
+ case SPELL_TROGS_HAND:
+ case SPELL_BURN_SPELLBOOK:
case SPELL_SWIFTNESS:
case SPELL_WATER_ELEMENTALS:
case SPELL_FIRE_ELEMENTALS:
@@ -893,7 +901,6 @@ bool setup_mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast,
case SPELL_SILENCE:
case SPELL_AWAKEN_FOREST:
case SPELL_SUMMON_CANIFORMS:
- case SPELL_REGENERATION:
return (true);
default:
if (check_validity)
@@ -1816,6 +1823,9 @@ void mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast,
case SPELL_VAMPIRIC_DRAINING:
{
actor *target = monster->get_foe();
+ if (grid_distance(monster->pos(), target->pos()) > 1)
+ return;
+
const bool target_is_you = target->pos() == you.pos();
monsters* mtarget = monster; // dummy assignment
int hp;
@@ -1832,7 +1842,11 @@ void mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast,
target_is_safe = mtarget->undead_or_demonic();
}
- int hp_cost = 3 + random2avg(9, 2) + 1 + random2(monster->hit_dice) / 7;
+ int factor = 1;
+ if (monster->type == MONS_DEEP_DWARF_NECROMANCER)
+ factor = 2;
+ int pow = random2(monster->hit_dice * factor);
+ int hp_cost = 3 + random2avg(9, 2) + 1 + pow / 7;
hp_cost = std::min(hp, hp_cost);
hp_cost = std::min(monster->max_hit_points - monster->hit_points, hp_cost);
@@ -1887,6 +1901,88 @@ void mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast,
case SPELL_BERSERKER_RAGE:
monster->go_berserk(true);
return;
+
+ case SPELL_TROGS_HAND:
+ {
+ int dur = 5 + roll_dice(2, (monster->hit_dice * 10) / 3 + 1);
+ if (dur > 100)
+ {
+ dur = 100;
+ }
+ monster->add_ench(mon_enchant(ENCH_RAISED_MR, 0, KC_OTHER, dur));
+ monster->add_ench(mon_enchant(ENCH_REGENERATION, 0, KC_OTHER, dur));
+ dprf("Trogs Hand cast (dur: %d)", dur);
+ return;
+ }
+
+ case SPELL_BROTHERS_IN_ARMS:
+ {
+ const int power = (monster->hit_dice * 20) + random2(monster->hit_dice * 5) - random2(monster->hit_dice * 5);
+ summon_berserker(power, GOD_TROG, 0, true);
+ return;
+ }
+
+ case SPELL_BURN_SPELLBOOK:
+ {
+ for (stack_iterator si(monster->pos()); si; ++si)
+ {
+ if (si->base_type == OBJ_BOOKS
+ && si->sub_type != BOOK_MANUAL
+ && si->sub_type != BOOK_DESTRUCTION)
+ {
+ return;
+ }
+ }
+
+ for (radius_iterator ri(monster->pos(), LOS_RADIUS, true, true, true); ri; ++ri)
+ {
+ const unsigned short cloud = env.cgrid(*ri);
+ if (feat_is_solid(grd(*ri))
+ || cloud != EMPTY_CLOUD && env.cloud[cloud].type != CLOUD_FIRE)
+ {
+ continue;
+ }
+
+ int count = 0;
+ int rarity = 0;
+ for (stack_iterator si(*ri); si; ++si)
+ {
+ if (si->base_type != OBJ_BOOKS
+ || si->sub_type == BOOK_MANUAL
+ || si->sub_type == BOOK_DESTRUCTION)
+ {
+ continue;
+ }
+
+ rarity += book_rarity(si->sub_type);
+
+ dprf("Burned book rarity: %d", rarity);
+ destroy_item(si.link());
+ count++;
+ }
+
+ if (count)
+ {
+ if (cloud != EMPTY_CLOUD)
+ {
+ // Reinforce the cloud.
+ mpr("The fire roars with new energy!");
+ const int extra_dur = count + random2(rarity / 2);
+ env.cloud[cloud].decay += extra_dur * 5;
+ env.cloud[cloud].set_whose(KC_OTHER);
+ continue;
+ }
+
+ const int dur = std::min(4 + count + random2(rarity/2), 23);
+ place_cloud(CLOUD_FIRE, *ri, dur, KC_OTHER);
+
+ mprf(MSGCH_GOD, "The book%s burst%s into flames.",
+ count == 1 ? "" : "s",
+ count == 1 ? "s" : "");
+ }
+ }
+ return;
+ }
case SPELL_SWIFTNESS:
monster->add_ench(ENCH_SWIFT);
diff --git a/crawl-ref/source/mon-data.h b/crawl-ref/source/mon-data.h
index 64948f4..b962eb3 100644
--- a/crawl-ref/source/mon-data.h
+++ b/crawl-ref/source/mon-data.h
@@ -1923,6 +1923,18 @@ static monsterentry mondata[] = {
},
{
+ MONS_DEEP_DWARF_BERSERKER, 'v', BROWN, "deep dwarf berserker",
+ M_WARM_BLOOD | M_SPEAKS | M_NO_REGEN,
+ MR_NO_FLAGS,
+ 600, 10, MONS_DWARF, MONS_DEEP_DWARF, MH_NATURAL, -6,
+ { {AT_HIT, AF_PLAIN, 10}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
+ { 5, 5, 7, 0 },
+ 2, 12, MST_DEEP_DWARF_BERSERKER, CE_CONTAMINATED, Z_SMALL, S_SHOUT,
+ I_NORMAL, HT_LAND, FL_NONE, 10, DEFAULT_ENERGY,
+ MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_MEDIUM
+},
+
+{
MONS_DEEP_DWARF_NECROMANCER, 'v', MAGENTA, "deep dwarf necromancer",
M_NO_REGEN | M_SPELLCASTER | M_ACTUAL_SPELLS | M_WARM_BLOOD | M_SPEAKS,
MR_NO_FLAGS,
@@ -3959,7 +3971,7 @@ static monsterentry mondata[] = {
550, 10, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -4,
{ {AT_HIT, AF_PLAIN, 6}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 8, 2, 4, 0 },
- 0, 13, MST_NO_SPELLS, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT,
+ 0, 13, MST_WITCH_I, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT,
I_HIGH, HT_LAND, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_MEDIUM
},
@@ -3971,7 +3983,7 @@ static monsterentry mondata[] = {
550, 10, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -4,
{ {AT_HIT, AF_PLAIN, 6}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 8, 2, 4, 0 },
- 0, 13, MST_NO_SPELLS, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT,
+ 0, 13, MST_HULDRA, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT,
I_HIGH, HT_LAND, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_MEDIUM
},
@@ -3983,7 +3995,7 @@ static monsterentry mondata[] = {
550, 10, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -4,
{ {AT_HIT, AF_PLAIN, 6}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 10, 2, 4, 0 },
- 0, 13, MST_NO_SPELLS, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT,
+ 0, 13, MST_WITCH_II, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT,
I_HIGH, HT_LAND, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_MEDIUM
},
@@ -3995,7 +4007,7 @@ static monsterentry mondata[] = {
550, 10, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -4,
{ {AT_HIT, AF_PLAIN, 6}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 10, 2, 4, 0 },
- 0, 13, MST_NO_SPELLS, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT,
+ 0, 13, MST_WITCH_III, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT,
I_HIGH, HT_LAND, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_MEDIUM
},
@@ -4007,7 +4019,7 @@ static monsterentry mondata[] = {
550, 10, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -4,
{ {AT_HIT, AF_PLAIN, 6}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 10, 2, 4, 0 },
- 0, 13, MST_NO_SPELLS, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT,
+ 0, 13, MST_TROLLKONOR, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT,
I_HIGH, HT_LAND, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_MEDIUM
},
diff --git a/crawl-ref/source/mon-gear.cc b/crawl-ref/source/mon-gear.cc
index 0bde76a..68c5326 100644
--- a/crawl-ref/source/mon-gear.cc
+++ b/crawl-ref/source/mon-gear.cc
@@ -323,28 +323,35 @@ static item_make_species_type _give_weapon(monsters *mon, int level,
item.sub_type = WPN_CROSSBOW;
break;
}
+ // deliberate fall through
+ case MONS_DEEP_DWARF_BERSERKER:
+ item_race = MAKE_ITEM_DWARVEN;
+ item.base_type = OBJ_WEAPONS;
if (one_chance_in(6))
{
- random_choose_weighted(5, WPN_SPIKED_FLAIL, 5, WPN_GREAT_MACE,
+ item.sub_type = random_choose_weighted(5, WPN_SPIKED_FLAIL, 5, WPN_GREAT_MACE,
5, WPN_GREAT_SWORD, 10, WPN_BROAD_AXE,
15, WPN_BATTLEAXE, 0);
}
else
{
- random_choose_weighted(5, WPN_FLAIL, 5, WPN_MACE,
+ item.sub_type = random_choose_weighted(5, WPN_FLAIL, 5, WPN_MACE,
5, WPN_SPEAR, 5, WPN_HALBERD,
5, WPN_GREAT_SWORD, 10, WPN_WAR_AXE,
15, WPN_HAND_AXE, 0);
}
- if (coinflip())
+ if (coinflip() || mon->type == MONS_DEEP_DWARF_BERSERKER)
{
force_item = true;
item.plus += 1 + random2(4);
item.plus2 += 1 + random2(4);
+
+ if (one_chance_in(30) && mon->type == MONS_DEEP_DWARF_BERSERKER)
+ level = MAKE_GOOD_ITEM;
}
- else if (one_chance_in(3))
+ else if (one_chance_in(3) && mon->type != MONS_DEEP_DWARF_BERSERKER)
{
item.plus = -1 + (-1 * random2(4));
item.plus2 = -1 + (-1 * random2(4));
@@ -1729,6 +1736,7 @@ void give_armour(monsters *mon, int level)
item.sub_type = ARM_ROBE;
break;
+ case MONS_DEEP_DWARF_BERSERKER:
case MONS_DEEP_DWARF:
case MONS_DWARF:
item_race = MAKE_ITEM_DWARVEN;
diff --git a/crawl-ref/source/mon-info.cc b/crawl-ref/source/mon-info.cc
index a32272b..9a0853e 100644
--- a/crawl-ref/source/mon-info.cc
+++ b/crawl-ref/source/mon-info.cc
@@ -106,6 +106,10 @@ static uint64_t ench_to_mb(const monsters &mons, enchant_type ench)
return ULL1 << MB_PARALYSED;
case ENCH_SOUL_RIPE:
return ULL1 << MB_POSSESSABLE;
+ case ENCH_REGENERATION:
+ return ULL1 << MB_REGENERATION;
+ case ENCH_RAISED_MR:
+ return ULL1 << MB_RAISED_MR;
default:
return 0;
}
diff --git a/crawl-ref/source/mon-info.h b/crawl-ref/source/mon-info.h
index be15fb6..e2e4c54 100644
--- a/crawl-ref/source/mon-info.h
+++ b/crawl-ref/source/mon-info.h
@@ -46,6 +46,8 @@ enum monster_info_flags
MB_SUBMERGED,
MB_BLEEDING,
MB_DEFLECT_MSL,
+ MB_REGENERATION,
+ MB_RAISED_MR,
MB_SAFE,
MB_UNSAFE,
MB_NAME_SUFFIX, // [art] rat foo does...
diff --git a/crawl-ref/source/mon-spll.h b/crawl-ref/source/mon-spll.h
index cbd9dfc..939d43e 100644
--- a/crawl-ref/source/mon-spll.h
+++ b/crawl-ref/source/mon-spll.h
@@ -74,6 +74,17 @@
}
},
+ { MST_DEEP_DWARF_BERSERKER,
+ {
+ SPELL_BROTHERS_IN_ARMS,
+ SPELL_NO_SPELL,
+ SPELL_TROGS_HAND,
+ SPELL_BERSERKER_RAGE,
+ SPELL_BURN_SPELLBOOK,
+ SPELL_NO_SPELL
+ }
+ },
+
{ MST_GUARDIAN_SERPENT,
{
SPELL_TELEPORT_OTHER,
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index 2f1d534..8988e59 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -1591,6 +1591,11 @@ static bool _get_spellbook_list(mon_spellbook_type book[6],
book[1] = MST_NECROMANCER_II;
break;
+ case MONS_DEEP_DWARF_NECROMANCER:
+ book[0] = MST_DEEP_DWARF_NECROMANCER;
+ book[1] = MST_JESSICA;
+ break;
+
case MONS_ORC_WIZARD:
case MONS_DEEP_ELF_SOLDIER:
case MONS_DEEP_ELF_FIGHTER:
diff --git a/crawl-ref/source/monster.cc b/crawl-ref/source/monster.cc
index 7a1bd33..20e5ad2 100644
--- a/crawl-ref/source/monster.cc
+++ b/crawl-ref/source/monster.cc
@@ -3313,6 +3313,9 @@ int monsters::res_magic() const
if (has_ench(ENCH_LOWERED_MR))
u /= 2;
+ if (has_ench(ENCH_RAISED_MR)) //trog's hand
+ u += 70;
+
return (u);
}
@@ -6088,7 +6091,7 @@ static const char *enchant_names[] =
"petrified", "lowered_mr", "soul_ripe", "slowly_dying", "eat_items",
"aquatic_land", "spore_production", "slouch", "swift", "tide",
"insane", "silenced", "awaken_forest", "exploding", "bleeding",
- "antimagic", "buggy",
+ "antimagic", "regen", "magic_res", "buggy",
};
static const char *_mons_enchantment_name(enchant_type ench)
diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h
index 153a280..7de49b6 100644
--- a/crawl-ref/source/spl-data.h
+++ b/crawl-ref/source/spl-data.h
@@ -2672,6 +2672,45 @@ struct spell_desc
false
},
+{
+ SPELL_BROTHERS_IN_ARMS, "Brothers in Arms",
+ SPTYP_SUMMONING,
+ SPFLAG_MONSTER,
+ 6,
+ 0,
+ -1, -1,
+ 0,
+ NULL,
+ false,
+ false
+},
+
+{
+ SPELL_TROGS_HAND, "Trog's Hand",
+ SPTYP_ENCHANTMENT,
+ SPFLAG_MONSTER,
+ 3,
+ 0,
+ -1, -1,
+ 0,
+ NULL,
+ false,
+ false
+},
+
+{
+ SPELL_BURN_SPELLBOOK, "Burn Spellbook",
+ SPTYP_ENCHANTMENT,
+ SPFLAG_AREA,
+ 1,
+ 200,
+ LOS_RADIUS, LOS_RADIUS,
+ 0,
+ NULL,
+ false,
+ false
+},
+
{
SPELL_NO_SPELL, "nonexistent spell",
0,
--
1.7.0.4