summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/mods/theme/scpt/s_demon.lua177
-rw-r--r--lib/scpt/s_demon.lua177
-rw-r--r--src/externs.h29
-rw-r--r--src/spells.pkg32
-rw-r--r--src/spells3.c332
5 files changed, 429 insertions, 318 deletions
diff --git a/lib/mods/theme/scpt/s_demon.lua b/lib/mods/theme/scpt/s_demon.lua
index ada97310..d8f29a60 100644
--- a/lib/mods/theme/scpt/s_demon.lua
+++ b/lib/mods/theme/scpt/s_demon.lua
@@ -20,24 +20,8 @@ DEMON_BLADE = add_spell
["max_level"] = { 20, 40 },
},
},
- ["spell"] = function()
- local type, rad
-
- type = GF_FIRE
- if get_level(DEMON_BLADE) >= 30 then type = GF_HELL_FIRE end
-
- rad = 0
- if get_level(DEMON_BLADE) >= 45 then rad = 1 end
-
- return set_project(randint(20) + get_level(DEMON_BLADE, 80),
- type,
- 4 + get_level(DEMON_BLADE, 40),
- rad,
- bor(PROJECT_STOP, PROJECT_KILL))
- end,
- ["info"] = function()
- return "dur "..(get_level(DEMON_BLADE, 80)).."+d20 dam "..(4 + get_level(DEMON_BLADE, 40)).."/blow"
- end,
+ ["spell"] = function() return demonology_demon_blade() end,
+ ["info"] = function() return demonology_demon_blade_info() end,
["desc"] = {
"Imbues your blade with fire to deal more damage",
"At level 30 it deals hellfire damage",
@@ -54,35 +38,8 @@ DEMON_MADNESS = add_spell
["mana_max"] = 20,
["fail"] = 25,
["random"] = 0,
- ["spell"] = function()
- local ret, dir, type, y1, x1, y2, x2
-
- ret, dir = get_aim_dir()
- if ret == FALSE then return end
-
- type = GF_CHAOS
- if magik(33) == TRUE then type = GF_CONFUSION end
- if magik(33) == TRUE then type = GF_CHARM end
-
- -- Calc the coordinates of arrival
- y1, x1 = get_target(dir)
- y2 = player.py - (y1 - player.py)
- x2 = player.px - (x1 - player.px)
-
- local obvious = nil
- obvious = project(0, 1 + get_level(DEMON_MADNESS, 4, 0),
- y1, x1,
- 20 + get_level(DEMON_MADNESS, 200),
- type, bor(PROJECT_STOP, PROJECT_GRID, PROJECT_ITEM, PROJECT_KILL))
- obvious = is_obvious(project(0, 1 + get_level(DEMON_MADNESS, 4, 0),
- y2, x2,
- 20 + get_level(DEMON_MADNESS, 200),
- type, bor(PROJECT_STOP, PROJECT_GRID, PROJECT_ITEM, PROJECT_KILL)), obvious)
- return obvious
- end,
- ["info"] = function()
- return "dam "..(20 + get_level(DEMON_MADNESS, 200)).." rad "..(1 + get_level(DEMON_MADNESS, 4, 0))
- end,
+ ["spell"] = function() return demonology_demon_madness() end,
+ ["info"] = function() return demonology_demon_madness_info() end,
["desc"] = {
"Fire 2 balls in opposite directions of randomly chaos, confusion or charm",
}
@@ -97,16 +54,8 @@ DEMON_FIELD = add_spell
["mana_max"] = 60,
["fail"] = 60,
["random"] = 0,
- ["spell"] = function()
- local ret, dir
-
- ret, dir = get_aim_dir()
- if ret == FALSE then return end
- return fire_cloud(GF_NEXUS, dir, 20 + get_level(DEMON_FIELD, 70), 7, 30 + get_level(DEMON_FIELD, 100))
- end,
- ["info"] = function()
- return "dam "..(20 + get_level(DEMON_FIELD, 70)).." dur "..(30 + get_level(DEMON_FIELD, 100))
- end,
+ ["spell"] = function() return demonology_demon_field() end,
+ ["info"] = function() return demonology_demon_field_info() end,
["desc"] = {
"Fires a cloud of deadly nexus over a radius of 7",
}
@@ -123,12 +72,8 @@ DOOM_SHIELD = add_spell
["mana_max"] = 30,
["fail"] = 10,
["random"] = 0,
- ["spell"] = function()
- return set_shield(randint(10) + 20 + get_level(DOOM_SHIELD, 100), -300 + get_level(DOOM_SHIELD, 100), SHIELD_COUNTER, 1 + get_level(DOOM_SHIELD, 14), 10 + get_level(DOOM_SHIELD, 15))
- end,
- ["info"] = function()
- return "dur "..(20 + get_level(DOOM_SHIELD, 100)).."+d10 dam "..(1 + get_level(DOOM_SHIELD, 14)).."d"..(10 + get_level(DOOM_SHIELD, 15))
- end,
+ ["spell"] = function() return demonology_doom_shield() end,
+ ["info"] = function() return demonology_doom_shield_info() end,
["desc"] = {
"Raises a mirror of pain around you, doing very high damage to your foes",
"that dare hit you, but greatly reduces your armour class",
@@ -144,41 +89,8 @@ UNHOLY_WORD = add_spell
["mana_max"] = 45,
["fail"] = 55,
["random"] = 0,
- ["spell"] = function()
- local ret, x, y, c_ptr
- ret, x, y = tgt_pt()
- if ret == FALSE then return end
- c_ptr = cave(y, x)
-
- -- ok that is a monster
- if c_ptr.m_idx > 0 then
- local m_ptr = monster(c_ptr.m_idx)
- if m_ptr.status ~= MSTATUS_PET then
- msg_print("You can only target a pet.")
- return
- end
-
- -- Oups he is angry now
- if magik(30 - get_level(UNHOLY_WORD, 25, 0)) == TRUE then
- local m_name = monster_desc(m_ptr, 0).." turns against you."
- msg_print(strupper(strsub(m_name, 0, 1))..strsub(m_name, 2))
- else
- local m_name = monster_desc(m_ptr, 0)
- msg_print("You consume "..m_name..".")
-
- local heal = (m_ptr.hp * 100) / m_ptr.maxhp
- heal = ((30 + get_level(UNHOLY_WORD, 50, 0)) * heal) / 100
-
- hp_player(heal)
-
- delete_monster_idx(c_ptr.m_idx)
- end
- return TRUE
- end
- end,
- ["info"] = function()
- return "heal mhp% of "..(30 + get_level(UNHOLY_WORD, 50, 0)).."%"
- end,
+ ["spell"] = function() return demonology_unholy_word() end,
+ ["info"] = function() return demonology_unholy_word_info() end,
["desc"] = {
"Kills a pet to heal you",
"There is a chance that the pet won't die but will turn against you",
@@ -195,12 +107,8 @@ DEMON_CLOAK = add_spell
["mana_max"] = 40,
["fail"] = 70,
["random"] = 0,
- ["spell"] = function()
- return set_tim_reflect(randint(5) + 5 + get_level(DEMON_CLOAK, 15, 0))
- end,
- ["info"] = function()
- return "dur "..(5 + get_level(DEMON_CLOAK, 15, 0)).."+d5"
- end,
+ ["spell"] = function() return demonology_demon_cloak() end,
+ ["info"] = function() return demonology_demon_cloak_info() end,
["desc"] = {
"Raises a mirror that can reflect bolts and arrows for a time",
}
@@ -217,23 +125,8 @@ DEMON_SUMMON = add_spell
["mana_max"] = 50,
["fail"] = 30,
["random"] = 0,
- ["spell"] = function()
- local type = SUMMON_DEMON
- local level = dun_level
- local minlevel = 4
- if level < minlevel then level=minlevel end
- summon_specific_level = 5 + get_level(DEMON_SUMMON, 100)
- if get_level(DEMON_SUMMON) >= 35 then type = SUMMON_HI_DEMON end
- if summon_monster(player.py, player.px, level, TRUE, type) == TRUE then
- return TRUE
- else
- msg_print("Something blocks your summoning!")
- return FALSE
- end
- end,
- ["info"] = function()
- return "level "..(5 + get_level(DEMON_SUMMON, 100))
- end,
+ ["spell"] = function() return demonology_summon_demon() end,
+ ["info"] = function() return demonology_summon_demon_info() end,
["desc"] = {
"Summons a leveled demon to your side",
"At level 35 it summons a high demon",
@@ -249,37 +142,8 @@ DISCHARGE_MINION = add_spell
["mana_max"] = 50,
["fail"] = 30,
["random"] = 0,
- ["spell"] = function()
- local ret, x, y, c_ptr
- ret, x, y = tgt_pt()
- if ret == FALSE then return end
- c_ptr = cave(y, x)
-
- -- ok that is a monster
- if c_ptr.m_idx > 0 then
- local m_ptr = monster(c_ptr.m_idx)
- if m_ptr.status ~= MSTATUS_PET then
- msg_print("You can only target a pet.")
- return
- end
-
- local dam = m_ptr.hp
- delete_monster_idx(c_ptr.m_idx)
- dam = (dam * (20 + get_level(DISCHARGE_MINION, 60, 0))) / 100
- if dam > 100 + get_level(DISCHARGE_MINION, 500, 0) then
- dam = 100 + get_level(DISCHARGE_MINION, 500, 0)
- end
-
- -- We use project instead of fire_ball because we must tell it exactly where to land
- return project(0, 2,
- y, x,
- dam,
- GF_GRAVITY, bor(PROJECT_STOP, PROJECT_GRID, PROJECT_ITEM, PROJECT_KILL))
- end
- end,
- ["info"] = function()
- return "dam "..(20 + get_level(DISCHARGE_MINION, 60, 0)).."% max "..(100 + get_level(DISCHARGE_MINION, 500, 0))
- end,
+ ["spell"] = function() return demonology_discharge_minion() end,
+ ["info"] = function() return demonology_discharge_minion_info() end,
["desc"] = {
"The targeted pet will explode in a burst of gravity",
}
@@ -294,13 +158,8 @@ CONTROL_DEMON = add_spell
["mana_max"] = 70,
["fail"] = 55,
["random"] = 0,
- ["spell"] = function()
- local ret, dir = get_aim_dir()
- return fire_ball(GF_CONTROL_DEMON, dir, 50 + get_level(CONTROL_DEMON, 250), 0)
- end,
- ["info"] = function()
- return "power "..(50 + get_level(CONTROL_DEMON, 250))
- end,
+ ["spell"] = function() return demonology_control_demon() end,
+ ["info"] = function() return demonology_control_demon_info() end,
["desc"] = {
"Attempts to control a demon",
}
diff --git a/lib/scpt/s_demon.lua b/lib/scpt/s_demon.lua
index ada97310..d8f29a60 100644
--- a/lib/scpt/s_demon.lua
+++ b/lib/scpt/s_demon.lua
@@ -20,24 +20,8 @@ DEMON_BLADE = add_spell
["max_level"] = { 20, 40 },
},
},
- ["spell"] = function()
- local type, rad
-
- type = GF_FIRE
- if get_level(DEMON_BLADE) >= 30 then type = GF_HELL_FIRE end
-
- rad = 0
- if get_level(DEMON_BLADE) >= 45 then rad = 1 end
-
- return set_project(randint(20) + get_level(DEMON_BLADE, 80),
- type,
- 4 + get_level(DEMON_BLADE, 40),
- rad,
- bor(PROJECT_STOP, PROJECT_KILL))
- end,
- ["info"] = function()
- return "dur "..(get_level(DEMON_BLADE, 80)).."+d20 dam "..(4 + get_level(DEMON_BLADE, 40)).."/blow"
- end,
+ ["spell"] = function() return demonology_demon_blade() end,
+ ["info"] = function() return demonology_demon_blade_info() end,
["desc"] = {
"Imbues your blade with fire to deal more damage",
"At level 30 it deals hellfire damage",
@@ -54,35 +38,8 @@ DEMON_MADNESS = add_spell
["mana_max"] = 20,
["fail"] = 25,
["random"] = 0,
- ["spell"] = function()
- local ret, dir, type, y1, x1, y2, x2
-
- ret, dir = get_aim_dir()
- if ret == FALSE then return end
-
- type = GF_CHAOS
- if magik(33) == TRUE then type = GF_CONFUSION end
- if magik(33) == TRUE then type = GF_CHARM end
-
- -- Calc the coordinates of arrival
- y1, x1 = get_target(dir)
- y2 = player.py - (y1 - player.py)
- x2 = player.px - (x1 - player.px)
-
- local obvious = nil
- obvious = project(0, 1 + get_level(DEMON_MADNESS, 4, 0),
- y1, x1,
- 20 + get_level(DEMON_MADNESS, 200),
- type, bor(PROJECT_STOP, PROJECT_GRID, PROJECT_ITEM, PROJECT_KILL))
- obvious = is_obvious(project(0, 1 + get_level(DEMON_MADNESS, 4, 0),
- y2, x2,
- 20 + get_level(DEMON_MADNESS, 200),
- type, bor(PROJECT_STOP, PROJECT_GRID, PROJECT_ITEM, PROJECT_KILL)), obvious)
- return obvious
- end,
- ["info"] = function()
- return "dam "..(20 + get_level(DEMON_MADNESS, 200)).." rad "..(1 + get_level(DEMON_MADNESS, 4, 0))
- end,
+ ["spell"] = function() return demonology_demon_madness() end,
+ ["info"] = function() return demonology_demon_madness_info() end,
["desc"] = {
"Fire 2 balls in opposite directions of randomly chaos, confusion or charm",
}
@@ -97,16 +54,8 @@ DEMON_FIELD = add_spell
["mana_max"] = 60,
["fail"] = 60,
["random"] = 0,
- ["spell"] = function()
- local ret, dir
-
- ret, dir = get_aim_dir()
- if ret == FALSE then return end
- return fire_cloud(GF_NEXUS, dir, 20 + get_level(DEMON_FIELD, 70), 7, 30 + get_level(DEMON_FIELD, 100))
- end,
- ["info"] = function()
- return "dam "..(20 + get_level(DEMON_FIELD, 70)).." dur "..(30 + get_level(DEMON_FIELD, 100))
- end,
+ ["spell"] = function() return demonology_demon_field() end,
+ ["info"] = function() return demonology_demon_field_info() end,
["desc"] = {
"Fires a cloud of deadly nexus over a radius of 7",
}
@@ -123,12 +72,8 @@ DOOM_SHIELD = add_spell
["mana_max"] = 30,
["fail"] = 10,
["random"] = 0,
- ["spell"] = function()
- return set_shield(randint(10) + 20 + get_level(DOOM_SHIELD, 100), -300 + get_level(DOOM_SHIELD, 100), SHIELD_COUNTER, 1 + get_level(DOOM_SHIELD, 14), 10 + get_level(DOOM_SHIELD, 15))
- end,
- ["info"] = function()
- return "dur "..(20 + get_level(DOOM_SHIELD, 100)).."+d10 dam "..(1 + get_level(DOOM_SHIELD, 14)).."d"..(10 + get_level(DOOM_SHIELD, 15))
- end,
+ ["spell"] = function() return demonology_doom_shield() end,
+ ["info"] = function() return demonology_doom_shield_info() end,
["desc"] = {
"Raises a mirror of pain around you, doing very high damage to your foes",
"that dare hit you, but greatly reduces your armour class",
@@ -144,41 +89,8 @@ UNHOLY_WORD = add_spell
["mana_max"] = 45,
["fail"] = 55,
["random"] = 0,
- ["spell"] = function()
- local ret, x, y, c_ptr
- ret, x, y = tgt_pt()
- if ret == FALSE then return end
- c_ptr = cave(y, x)
-
- -- ok that is a monster
- if c_ptr.m_idx > 0 then
- local m_ptr = monster(c_ptr.m_idx)
- if m_ptr.status ~= MSTATUS_PET then
- msg_print("You can only target a pet.")
- return
- end
-
- -- Oups he is angry now
- if magik(30 - get_level(UNHOLY_WORD, 25, 0)) == TRUE then
- local m_name = monster_desc(m_ptr, 0).." turns against you."
- msg_print(strupper(strsub(m_name, 0, 1))..strsub(m_name, 2))
- else
- local m_name = monster_desc(m_ptr, 0)
- msg_print("You consume "..m_name..".")
-
- local heal = (m_ptr.hp * 100) / m_ptr.maxhp
- heal = ((30 + get_level(UNHOLY_WORD, 50, 0)) * heal) / 100
-
- hp_player(heal)
-
- delete_monster_idx(c_ptr.m_idx)
- end
- return TRUE
- end
- end,
- ["info"] = function()
- return "heal mhp% of "..(30 + get_level(UNHOLY_WORD, 50, 0)).."%"
- end,
+ ["spell"] = function() return demonology_unholy_word() end,
+ ["info"] = function() return demonology_unholy_word_info() end,
["desc"] = {
"Kills a pet to heal you",
"There is a chance that the pet won't die but will turn against you",
@@ -195,12 +107,8 @@ DEMON_CLOAK = add_spell
["mana_max"] = 40,
["fail"] = 70,
["random"] = 0,
- ["spell"] = function()
- return set_tim_reflect(randint(5) + 5 + get_level(DEMON_CLOAK, 15, 0))
- end,
- ["info"] = function()
- return "dur "..(5 + get_level(DEMON_CLOAK, 15, 0)).."+d5"
- end,
+ ["spell"] = function() return demonology_demon_cloak() end,
+ ["info"] = function() return demonology_demon_cloak_info() end,
["desc"] = {
"Raises a mirror that can reflect bolts and arrows for a time",
}
@@ -217,23 +125,8 @@ DEMON_SUMMON = add_spell
["mana_max"] = 50,
["fail"] = 30,
["random"] = 0,
- ["spell"] = function()
- local type = SUMMON_DEMON
- local level = dun_level
- local minlevel = 4
- if level < minlevel then level=minlevel end
- summon_specific_level = 5 + get_level(DEMON_SUMMON, 100)
- if get_level(DEMON_SUMMON) >= 35 then type = SUMMON_HI_DEMON end
- if summon_monster(player.py, player.px, level, TRUE, type) == TRUE then
- return TRUE
- else
- msg_print("Something blocks your summoning!")
- return FALSE
- end
- end,
- ["info"] = function()
- return "level "..(5 + get_level(DEMON_SUMMON, 100))
- end,
+ ["spell"] = function() return demonology_summon_demon() end,
+ ["info"] = function() return demonology_summon_demon_info() end,
["desc"] = {
"Summons a leveled demon to your side",
"At level 35 it summons a high demon",
@@ -249,37 +142,8 @@ DISCHARGE_MINION = add_spell
["mana_max"] = 50,
["fail"] = 30,
["random"] = 0,
- ["spell"] = function()
- local ret, x, y, c_ptr
- ret, x, y = tgt_pt()
- if ret == FALSE then return end
- c_ptr = cave(y, x)
-
- -- ok that is a monster
- if c_ptr.m_idx > 0 then
- local m_ptr = monster(c_ptr.m_idx)
- if m_ptr.status ~= MSTATUS_PET then
- msg_print("You can only target a pet.")
- return
- end
-
- local dam = m_ptr.hp
- delete_monster_idx(c_ptr.m_idx)
- dam = (dam * (20 + get_level(DISCHARGE_MINION, 60, 0))) / 100
- if dam > 100 + get_level(DISCHARGE_MINION, 500, 0) then
- dam = 100 + get_level(DISCHARGE_MINION, 500, 0)
- end
-
- -- We use project instead of fire_ball because we must tell it exactly where to land
- return project(0, 2,
- y, x,
- dam,
- GF_GRAVITY, bor(PROJECT_STOP, PROJECT_GRID, PROJECT_ITEM, PROJECT_KILL))
- end
- end,
- ["info"] = function()
- return "dam "..(20 + get_level(DISCHARGE_MINION, 60, 0)).."% max "..(100 + get_level(DISCHARGE_MINION, 500, 0))
- end,
+ ["spell"] = function() return demonology_discharge_minion() end,
+ ["info"] = function() return demonology_discharge_minion_info() end,
["desc"] = {
"The targeted pet will explode in a burst of gravity",
}
@@ -294,13 +158,8 @@ CONTROL_DEMON = add_spell
["mana_max"] = 70,
["fail"] = 55,
["random"] = 0,
- ["spell"] = function()
- local ret, dir = get_aim_dir()
- return fire_ball(GF_CONTROL_DEMON, dir, 50 + get_level(CONTROL_DEMON, 250), 0)
- end,
- ["info"] = function()
- return "power "..(50 + get_level(CONTROL_DEMON, 250))
- end,
+ ["spell"] = function() return demonology_control_demon() end,
+ ["info"] = function() return demonology_control_demon_info() end,
["desc"] = {
"Attempts to control a demon",
}
diff --git a/src/externs.h b/src/externs.h
index 6a3bdb07..a7fd0c42 100644
--- a/src/externs.h
+++ b/src/externs.h
@@ -1441,6 +1441,35 @@ char *convey_recall_info();
bool_ *convey_probability_travel();
char *convey_probability_travel_info();
+extern s32b DEMON_BLADE;
+extern s32b DEMON_MADNESS;
+extern s32b DEMON_FIELD;
+extern s32b DOOM_SHIELD;
+extern s32b UNHOLY_WORD;
+extern s32b DEMON_CLOAK;
+extern s32b DEMON_SUMMON;
+extern s32b DISCHARGE_MINION;
+extern s32b CONTROL_DEMON;
+
+bool_ *demonology_demon_blade();
+char *demonology_demon_blade_info();
+bool_ *demonology_demon_madness();
+char *demonology_demon_madness_info();
+bool_ *demonology_demon_field();
+char *demonology_demon_field_info();
+bool_ *demonology_doom_shield();
+char *demonology_doom_shield_info();
+bool_ *demonology_unholy_word();
+char *demonology_unholy_word_info();
+bool_ *demonology_demon_cloak();
+char *demonology_demon_cloak_info();
+bool_ *demonology_summon_demon();
+char *demonology_summon_demon_info();
+bool_ *demonology_discharge_minion();
+char *demonology_discharge_minion_info();
+bool_ *demonology_control_demon();
+char *demonology_control_demon_info();
+
/* randart.c */
extern int get_activation_power(void);
extern void build_prob(cptr learn);
diff --git a/src/spells.pkg b/src/spells.pkg
index f1a83a23..040001ff 100644
--- a/src/spells.pkg
+++ b/src/spells.pkg
@@ -2467,3 +2467,35 @@ bool_ *convey_recall();
char *convey_recall_info();
bool_ *convey_probability_travel();
char *convey_probability_travel_info();
+
+/*
+ * Demonology
+ */
+extern s32b DEMON_BLADE;
+extern s32b DEMON_MADNESS;
+extern s32b DEMON_FIELD;
+extern s32b DOOM_SHIELD;
+extern s32b UNHOLY_WORD;
+extern s32b DEMON_CLOAK;
+extern s32b DEMON_SUMMON;
+extern s32b DISCHARGE_MINION;
+extern s32b CONTROL_DEMON;
+
+bool_ *demonology_demon_blade();
+char *demonology_demon_blade_info();
+bool_ *demonology_demon_madness();
+char *demonology_demon_madness_info();
+bool_ *demonology_demon_field();
+char *demonology_demon_field_info();
+bool_ *demonology_doom_shield();
+char *demonology_doom_shield_info();
+bool_ *demonology_unholy_word();
+char *demonology_unholy_word_info();
+bool_ *demonology_demon_cloak();
+char *demonology_demon_cloak_info();
+bool_ *demonology_summon_demon();
+char *demonology_summon_demon_info();
+bool_ *demonology_discharge_minion();
+char *demonology_discharge_minion_info();
+bool_ *demonology_control_demon();
+char *demonology_control_demon_info();
diff --git a/src/spells3.c b/src/spells3.c
index dd75aac0..3e95c92d 100644
--- a/src/spells3.c
+++ b/src/spells3.c
@@ -14,6 +14,16 @@ s32b TELEAWAY;
s32b RECALL;
s32b PROBABILITY_TRAVEL;
+s32b DEMON_BLADE;
+s32b DEMON_MADNESS;
+s32b DEMON_FIELD;
+s32b DOOM_SHIELD;
+s32b UNHOLY_WORD;
+s32b DEMON_CLOAK;
+s32b DEMON_SUMMON;
+s32b DISCHARGE_MINION;
+s32b CONTROL_DEMON;
+
/* FIXME: Hackish workaround while we're still tied to Lua. This lets
us return Lua's "nil" and a non-nil value (which is all the s_aux.lua
cares about). */
@@ -354,3 +364,325 @@ char *convey_probability_travel_info()
get_level_s(PROBABILITY_TRAVEL, 60));
return buf;
}
+
+bool_ *demonology_demon_blade()
+{
+ int rad, type;
+
+ type = GF_FIRE;
+ if (get_level_s(DEMON_BLADE, 50) >= 30)
+ {
+ type = GF_HELL_FIRE;
+ }
+
+ rad = 0;
+ if (get_level_s(DEMON_BLADE, 50) >= 45)
+ {
+ rad = 1;
+ }
+
+ set_project(randint(20) + get_level_s(DEMON_BLADE, 80),
+ type,
+ 4 + get_level_s(DEMON_BLADE, 40),
+ rad,
+ PROJECT_STOP | PROJECT_KILL);
+ return CAST;
+}
+
+char *demonology_demon_blade_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "dur %d+d20 dam %d/blow",
+ (get_level_s(DEMON_BLADE, 80)),
+ (4 + get_level_s(DEMON_BLADE, 40)));
+ return buf;
+}
+
+bool_ *demonology_demon_madness()
+{
+ int dir, type, y1, x1, y2, x2;
+
+ if (!get_aim_dir(&dir))
+ {
+ return NO_CAST;
+ }
+
+ type = GF_CHAOS;
+ if (magik(33))
+ {
+ type = GF_CONFUSION;
+ }
+ if (magik(33))
+ {
+ type = GF_CHARM;
+ }
+
+ /* Calc the coordinates of arrival */
+ get_target(dir, &y1, &x1);
+ y2 = p_ptr->py - (y1 - p_ptr->py);
+ x2 = p_ptr->px - (x1 - p_ptr->px);
+
+ project(0, 1 + get_level(DEMON_MADNESS, 4, 0),
+ y1, x1,
+ 20 + get_level_s(DEMON_MADNESS, 200),
+ type,
+ PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL);
+ project(0, 1 + get_level(DEMON_MADNESS, 4, 0),
+ y2, x2,
+ 20 + get_level_s(DEMON_MADNESS, 200),
+ type,
+ PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL);
+
+ return CAST;
+}
+
+char *demonology_demon_madness_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "dam %d rad %d",
+ (20 + get_level_s(DEMON_MADNESS, 200)),
+ (1 + get_level(DEMON_MADNESS, 4, 0)));
+ return buf;
+}
+
+bool_ *demonology_demon_field()
+{
+ int dir;
+
+ if (!get_aim_dir(&dir))
+ {
+ return NO_CAST;
+ }
+
+ fire_cloud(GF_NEXUS,
+ dir,
+ 20 + get_level_s(DEMON_FIELD, 70),
+ 7,
+ 30 + get_level_s(DEMON_FIELD, 100));
+ return CAST;
+}
+
+char *demonology_demon_field_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "dam %d dur %d",
+ (20 + get_level_s(DEMON_FIELD, 70)),
+ (30 + get_level_s(DEMON_FIELD, 100)));
+ return buf;
+}
+
+bool_ *demonology_doom_shield()
+{
+ set_shield(randint(10) + 20 + get_level_s(DOOM_SHIELD, 100),
+ -300 + get_level_s(DOOM_SHIELD, 100),
+ SHIELD_COUNTER,
+ 1 + get_level_s(DOOM_SHIELD, 14),
+ 10 + get_level_s(DOOM_SHIELD, 15));
+ return CAST;
+}
+
+char *demonology_doom_shield_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "dur %d+d10 dam %dd%d",
+ (20 + get_level_s(DOOM_SHIELD, 100)),
+ (1 + get_level_s(DOOM_SHIELD, 14)),
+ (10 + get_level_s(DOOM_SHIELD, 15)));
+ return buf;
+}
+
+bool_ *demonology_unholy_word()
+{
+ int x, y;
+ cave_type *c_ptr = NULL;
+
+ if (!tgt_pt(&x, &y))
+ {
+ return NO_CAST;
+ }
+
+ c_ptr = &cave[y][x];
+ if (c_ptr->m_idx > 0)
+ {
+ monster_type *m_ptr = &m_list[c_ptr->m_idx];
+
+ if (m_ptr->status != MSTATUS_PET)
+ {
+ msg_print("You can only target a pet.");
+ return NO_CAST;
+ }
+
+ /* Oops he is angry now */
+ if (magik(30 - get_level(UNHOLY_WORD, 25, 0)))
+ {
+ char buf[128];
+ monster_desc(buf, m_ptr, 0);
+ if (buf[0] != '\0')
+ {
+ buf[0] = toupper(buf[0]);
+ }
+
+ msg_format("%s turns against you.", buf);
+ }
+ else
+ {
+ char buf[128];
+ s32b heal;
+
+ monster_desc(buf, m_ptr, 0);
+ msg_format("You consume %s.", buf);
+
+ heal = (m_ptr->hp * 100) / m_ptr->maxhp;
+ heal = ((30 + get_level(UNHOLY_WORD, 50, 0)) * heal) / 100;
+
+ hp_player(heal);
+
+ delete_monster_idx(c_ptr->m_idx);
+ }
+
+ return CAST;
+ }
+ else
+ {
+ return NO_CAST;
+ }
+}
+
+char *demonology_unholy_word_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "heal mhp%% of %d%%",
+ (30 + get_level(UNHOLY_WORD, 50, 0)));
+ return buf;
+}
+
+bool_ *demonology_demon_cloak()
+{
+ set_tim_reflect(randint(5) + 5 + get_level(DEMON_CLOAK, 15, 0));
+ return CAST;
+}
+
+char *demonology_demon_cloak_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "dur %d+d5",
+ (5 + get_level(DEMON_CLOAK, 15, 0)));
+ return buf;
+}
+
+bool_ *demonology_summon_demon()
+{
+ int type, level, minlevel;
+
+ level = dun_level;
+
+ minlevel = 4;
+ if (level < minlevel)
+ {
+ level = minlevel;
+ }
+
+ summon_specific_level = 5 + get_level_s(DEMON_SUMMON, 100);
+
+ type = SUMMON_DEMON;
+ if (get_level_s(DEMON_SUMMON, 50) >= 35)
+ {
+ type = SUMMON_HI_DEMON;
+ }
+
+ if (!summon_specific_friendly(p_ptr->py, p_ptr->px, level, type, TRUE))
+ {
+ msg_print("Something blocks your summoning!");
+ }
+
+ return CAST;
+}
+
+char *demonology_summon_demon_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "level %d",
+ (5 + get_level_s(DEMON_SUMMON, 100)));
+ return buf;
+}
+
+bool_ *demonology_discharge_minion()
+{
+ cave_type *c_ptr;
+ int x, y;
+
+ if (!tgt_pt(&x, &y))
+ {
+ return NO_CAST;
+ }
+
+ c_ptr = &cave[y][x];
+ if (c_ptr->m_idx > 0)
+ {
+ s32b dam;
+ monster_type *m_ptr = &m_list[c_ptr->m_idx];
+
+ if (m_ptr->status != MSTATUS_PET)
+ {
+ msg_print("You can only target a pet.");
+ return NO_CAST;
+ }
+
+ delete_monster_idx(c_ptr->m_idx);
+
+ dam = m_ptr->hp;
+ dam = (dam * (20 + get_level(DISCHARGE_MINION, 60, 0))) / 100;
+ if (dam > 100 + get_level(DISCHARGE_MINION, 500, 0))
+ {
+ dam = 100 + get_level(DISCHARGE_MINION, 500, 0);
+ }
+
+ /* We use project instead of fire_ball because we must tell it exactly where to land */
+ project(0, 2, y, x, dam,
+ GF_GRAVITY,
+ PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL);
+ return CAST;
+ }
+ else
+ {
+ return NO_CAST;
+ }
+}
+
+char *demonology_discharge_minion_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "dam %d%% max %d",
+ (20 + get_level(DISCHARGE_MINION, 60, 0)),
+ (100 + get_level(DISCHARGE_MINION, 500, 0)));
+ return buf;
+}
+
+bool_ *demonology_control_demon()
+{
+ int dir;
+ if (!get_aim_dir(&dir))
+ {
+ return NO_CAST;
+ }
+
+ fire_ball(GF_CONTROL_DEMON, dir, 50 + get_level_s(CONTROL_DEMON, 250), 0);
+ return CAST;
+}
+
+char *demonology_control_demon_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "power %d",
+ (50 + get_level_s(CONTROL_DEMON, 250)));
+ return buf;
+}