summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBardur Arantsson <bardur@scientician.net>2012-05-13 10:55:44 +0200
committerBardur Arantsson <bardur@scientician.net>2012-05-13 14:24:52 +0200
commit806d9737befef6ca878befbcddeb30634ce62083 (patch)
treea58a638f77664b8a2235cbefd8ad71cb1c7602be
parent2d57accf3a3c68e7eb41571eadf54ca2c7c4607f (diff)
Lua: Move "device" spell functions to C
-rw-r--r--lib/mods/theme/scpt/s_stick.lua252
-rw-r--r--lib/scpt/s_stick.lua203
-rw-r--r--src/externs.h44
-rw-r--r--src/spells.pkg44
-rw-r--r--src/spells3.c371
5 files changed, 507 insertions, 407 deletions
diff --git a/lib/mods/theme/scpt/s_stick.lua b/lib/mods/theme/scpt/s_stick.lua
index 9bbd641a..20d70856 100644
--- a/lib/mods/theme/scpt/s_stick.lua
+++ b/lib/mods/theme/scpt/s_stick.lua
@@ -19,15 +19,8 @@ DEVICE_HEAL_MONSTER = add_spell
["max_level"] = { 20, 50 },
},
},
- ["spell"] = function()
- local ret, dir = get_aim_dir()
- if ret == FALSE then return end
-
- return fire_ball(GF_OLD_HEAL, dir, 20 + get_level(DEVICE_HEAL_MONSTER, 380), 0)
- end,
- ["info"] = function()
- return "heal "..(20 + get_level(DEVICE_HEAL_MONSTER, 380))
- end,
+ ["spell"] = function() return device_heal_monster() end,
+ ["info"] = function() return device_heal_monster_info() end,
["desc"] = {
"Heals a monster",
}
@@ -52,15 +45,8 @@ DEVICE_SPEED_MONSTER = add_spell
["max_level"] = { 20, 50 },
},
},
- ["spell"] = function()
- local ret, dir = get_aim_dir()
- if ret == FALSE then return end
-
- return fire_ball(GF_OLD_SPEED, dir, 1, 0)
- end,
- ["info"] = function()
- return "speed +10"
- end,
+ ["spell"] = function() return device_haste_monster() end,
+ ["info"] = function() return device_haste_monster_info() end,
["desc"] = {
"Haste a monster",
}
@@ -85,13 +71,8 @@ DEVICE_WISH = add_spell
["max_level"] = { 1, 1 },
},
},
- ["spell"] = function()
- make_wish()
- return TRUE
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function() return device_wish() end,
+ ["info"] = function() return device_wish_info() end,
["desc"] = {
"This grants you a wish, beware of what you ask for!",
}
@@ -116,17 +97,8 @@ DEVICE_SUMMON = add_spell
["max_level"] = { 25, 50 },
},
},
- ["spell"] = function()
- local i, obvious
- obvious = nil
- for i = 1, 4 + get_level(DEVICE_SUMMON, 30) do
- obvious = is_obvious(summon_specific(player.py, player.px, dun_level, 0), obvious)
- end
- return obvious
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function() return device_summon_monster() end,
+ ["info"] = function() return device_summon_monster_info() end,
["desc"] = {
"Summons hostile monsters near you",
}
@@ -151,13 +123,8 @@ DEVICE_MANA = add_spell
["max_level"] = { 20, 35 },
},
},
- ["spell"] = function()
- increase_mana((player.msp * (20 + get_level(DEVICE_MANA, 50))) / 100)
- return TRUE
- end,
- ["info"] = function()
- return "restore "..(20 + get_level(DEVICE_MANA, 50)).."%"
- end,
+ ["spell"] = function() return device_mana() end,
+ ["info"] = function() return device_mana_info() end,
["desc"] = {
"Restores a part(or all) of your mana",
}
@@ -188,12 +155,8 @@ DEVICE_NOTHING = add_spell
["max_level"] = { 1, 1},
},
},
- ["spell"] = function()
- return FALSE
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function() return device_nothing() end,
+ ["info"] = function() return device_nothing_info() end,
["desc"] = {
"It does nothing.",
}
@@ -209,14 +172,8 @@ DEVICE_MAGGOT = add_spell
["fail"] = 20,
["random"] = -1,
["activate"] = { 10, 50 },
- ["spell"] = function()
- local ret, dir = get_aim_dir()
- if ret == FALSE then return end
- return fire_ball(GF_TURN_ALL, dir, 40, 2)
- end,
- ["info"] = function()
- return "power 40 rad 2"
- end,
+ ["spell"] = function() return device_maggot() end,
+ ["info"] = function() return device_maggot_info() end,
["desc"] = {
"terrify",
}
@@ -242,12 +199,8 @@ DEVICE_HOLY_FIRE = add_spell
["max_level"] = { 35, 35 },
},
},
- ["spell"] = function()
- return project_los(GF_HOLY_FIRE, 50 + get_level(DEVICE_HOLY_FIRE, 300))
- end,
- ["info"] = function()
- return "dam "..(50 + get_level(DEVICE_HOLY_FIRE, 250))
- end,
+ ["spell"] = function() return device_holy_fire() end,
+ ["info"] = function() return device_holy_fire_info() end,
["desc"] = {
"The Holy Fire created by this staff will deeply(double damage) burn",
"all that is evil.",
@@ -266,84 +219,8 @@ DEVICE_ETERNAL_FLAME = add_spell
["fail"] = 0,
["random"] = -1,
["activate"] = { 0, 0 },
- ["spell"] = function(flame_item)
- local ret, item, obj
-
- ret, item = get_item("Which object do you want to imbue?",
- "You have no objects to imbue.",
- bor(USE_INVEN),
- function (obj)
- if obj.name1 > 0 or obj.name2 > 0 then return FALSE end
- if (obj.tval == TV_SWORD) and (obj.sval == SV_LONG_SWORD) then
- return TRUE
- elseif (obj.tval == TV_MSTAFF) and (obj.sval == SV_MSTAFF) then
- return TRUE
- elseif (obj.tval == TV_BOW) and (obj.sval == SV_HEAVY_XBOW) then
- return TRUE
- elseif (obj.tval == TV_DRAG_ARMOR) and (obj.sval == SV_DRAGON_POWER) then
- return TRUE
- elseif (obj.tval == TV_HAFTED) and (obj.sval == SV_LUCERN_HAMMER) then
- return TRUE
- elseif (obj.tval == TV_POLEARM) and (obj.sval == SV_TRIDENT) then
- return TRUE
- elseif (obj.tval == TV_AXE) and (obj.sval == SV_BATTLE_AXE) then
- return TRUE
- elseif (obj.tval == TV_BOW) and (obj.sval == SV_LONG_BOW) then
- return TRUE
- elseif (obj.tval == TV_BOOMERANG) and (obj.sval == SV_BOOM_METAL) then
- return TRUE
- elseif (obj.tval == TV_BOW) and (obj.sval == SV_SLING) then
- return TRUE
- elseif (obj.tval == TV_SWORD) and (obj.sval == SV_RAPIER) then
- return TRUE
- elseif (obj.tval == TV_AMULET) and (obj.sval == SV_AMULET_SPELL) then
- return TRUE
- end
- return FALSE
- end
- )
- if ret == FALSE then return FALSE end
-
- obj = get_object(item)
-
- if (obj.tval == TV_SWORD) and (obj.sval == SV_LONG_SWORD) then
- obj.name1 = 147
- elseif (obj.tval == TV_MSTAFF) and (obj.sval == SV_MSTAFF) then
- obj.name1 = 127
- elseif (obj.tval == TV_BOW) and (obj.sval == SV_HEAVY_XBOW) then
- obj.name1 = 152
- elseif (obj.tval == TV_DRAG_ARMOR) and (obj.sval == SV_DRAGON_POWER) then
- obj.name1 = 17
- elseif (obj.tval == TV_HAFTED) and (obj.sval == SV_LUCERN_HAMMER) then
- obj.name1 = 241
- elseif (obj.tval == TV_POLEARM) and (obj.sval == SV_TRIDENT) then
- obj.name1 = 242
- elseif (obj.tval == TV_AXE) and (obj.sval == SV_BROAD_AXE) then
- obj.name1 = 243
- elseif (obj.tval == TV_BOW) and (obj.sval == SV_LONG_BOW) then
- obj.name1 = 245
- elseif (obj.tval == TV_BOOMERANG) and (obj.sval == SV_BOOM_METAL) then
- obj.name1 = 247
- elseif (obj.tval == TV_BOW) and (obj.sval == SV_SLING) then
- obj.name1 = 246
- elseif (obj.tval == TV_SWORD) and (obj.sval == SV_RAPIER) then
- obj.name1 = 244
- elseif (obj.tval == TV_AMULET) and (obj.sval == SV_AMULET_SPELL) then
- obj.name1 = 248
- end
- apply_magic(obj, -1, TRUE, TRUE, TRUE)
-
- obj.found = OBJ_FOUND_SELFMADE
-
- inven_item_increase(flame_item, -1)
- inven_item_describe(flame_item)
- inven_item_optimize(flame_item)
-
- return TRUE
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function(flame_item) return device_eternal_flame(flame_item) end,
+ ["info"] = function() return "" end,
["desc"] = {
"Imbuing an object with the eternal fire",
}
@@ -369,18 +246,8 @@ DEVICE_THUNDERLORDS = add_spell
["max_level"] = { 1, 1 },
},
},
- ["spell"] = function()
- if dun_level > 0 then
- msg_print("As you blow the horn, an Eagle of Manwe appears overhead.")
- recall_player(0, 1)
- else
- msg_print("You cannot use it there.")
- end
- return TRUE
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function() return device_thunderlords() end,
+ ["info"] = function() return device_thunderlords_info() end,
["desc"] = {
"An Eagle of Manwe will appear to transport you quickly to the town.",
}
@@ -398,42 +265,8 @@ DEVICE_RADAGAST = add_spell
["fail"] = 10,
["random"] = -1,
["activate"] = 15000,
- ["spell"] = function()
- msg_print(TERM_GREEN, "The staff's power cleanses you completely!")
- remove_all_curse()
- do_res_stat(A_STR, TRUE)
- do_res_stat(A_CON, TRUE)
- do_res_stat(A_DEX, TRUE)
- do_res_stat(A_WIS, TRUE)
- do_res_stat(A_INT, TRUE)
- do_res_stat(A_CHR, TRUE)
- restore_level()
- clean_corruptions()
- hp_player(5000)
- heal_insanity(5000)
- set_poisoned(0)
- set_blind(0)
- set_confused(0)
- set_image(0)
- set_stun(0)
- set_cut(0)
- set_parasite(0, 0)
-
- if (player.black_breath) == TRUE then
- msg_print("The hold of the Black Breath on you is broken!")
- end
- player.black_breath = FALSE
-
- player.update = bor(player.update, PU_BONUS)
- player.window = bor(player.window, PW_PLAYER)
-
- return TRUE
- end,
-
- ["info"] = function()
- return ""
- end,
-
+ ["spell"] = function() return device_radagast() end,
+ ["info"] = function() return device_radagast_info() end,
["desc"] = {
"purity and health",
}
@@ -449,46 +282,9 @@ DEVICE_VALAROMA = add_spell
["fail"] = 25,
["random"] = -1,
["activate"] = 250,
- ["spell"] = function()
- local power = 5 * player.lev
- banish_evil(power)
- return FALSE
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function() return device_valaroma() end,
+ ["info"] = function() return device_valaroma_info() end,
["desc"] = {
"banish evil (level x5)",
}
}
---[[ Template
-DEVICE_ = add_spell
-{
- ["name"] = "",
- ["school"] = {SCHOOL_DEVICE},
- ["level"] = 1,
- ["mana"] = 2,
- ["mana_max"] = 15,
- ["fail"] = 10,
- ["random"] = -1,
- ["stick"] =
- {
- ["charge"] = { 10, 5 },
- [TV_STAFF] =
- {
- ["rarity"] = 7,
- ["base_level"] = { 1, 15 },
- ["max_level"] = { 25, 50 },
- },
- },
- ["spell"] = function()
- return FALSE
- end,
- ["info"] = function()
- return ""
- end,
- ["desc"] = {
- "",
- }
-}
-]]
diff --git a/lib/scpt/s_stick.lua b/lib/scpt/s_stick.lua
index 36647414..28abc0db 100644
--- a/lib/scpt/s_stick.lua
+++ b/lib/scpt/s_stick.lua
@@ -19,15 +19,8 @@ DEVICE_HEAL_MONSTER = add_spell
["max_level"] = { 20, 50 },
},
},
- ["spell"] = function()
- local ret, dir = get_aim_dir()
- if ret == FALSE then return end
-
- return fire_ball(GF_OLD_HEAL, dir, 20 + get_level(DEVICE_HEAL_MONSTER, 380), 0)
- end,
- ["info"] = function()
- return "heal "..(20 + get_level(DEVICE_HEAL_MONSTER, 380))
- end,
+ ["spell"] = function() return device_heal_monster() end,
+ ["info"] = function() return device_heal_monster_info() end,
["desc"] = {
"Heals a monster",
}
@@ -52,15 +45,8 @@ DEVICE_SPEED_MONSTER = add_spell
["max_level"] = { 20, 50 },
},
},
- ["spell"] = function()
- local ret, dir = get_aim_dir()
- if ret == FALSE then return end
-
- return fire_ball(GF_OLD_SPEED, dir, 1, 0)
- end,
- ["info"] = function()
- return "speed +10"
- end,
+ ["spell"] = function() return device_haste_monster() end,
+ ["info"] = function() return device_haste_monster_info() end,
["desc"] = {
"Haste a monster",
}
@@ -85,13 +71,8 @@ DEVICE_WISH = add_spell
["max_level"] = { 1, 1 },
},
},
- ["spell"] = function()
- make_wish()
- return TRUE
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function() return device_wish() end,
+ ["info"] = function() return device_wish_info() end,
["desc"] = {
"This grants you a wish, beware of what you ask for!",
}
@@ -116,17 +97,8 @@ DEVICE_SUMMON = add_spell
["max_level"] = { 25, 50 },
},
},
- ["spell"] = function()
- local i, obvious
- obvious = nil
- for i = 1, 4 + get_level(DEVICE_SUMMON, 30) do
- obvious = is_obvious(summon_specific(player.py, player.px, dun_level, 0), obvious)
- end
- return obvious
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function() return device_summon_monster() end,
+ ["info"] = function() return device_summon_monster_info() end,
["desc"] = {
"Summons hostile monsters near you",
}
@@ -151,13 +123,8 @@ DEVICE_MANA = add_spell
["max_level"] = { 20, 35 },
},
},
- ["spell"] = function()
- increase_mana((player.msp * (20 + get_level(DEVICE_MANA, 50))) / 100)
- return TRUE
- end,
- ["info"] = function()
- return "restore "..(20 + get_level(DEVICE_MANA, 50)).."%"
- end,
+ ["spell"] = function() return device_mana() end,
+ ["info"] = function() return device_mana_info() end,
["desc"] = {
"Restores a part(or all) of your mana",
}
@@ -188,12 +155,8 @@ DEVICE_NOTHING = add_spell
["max_level"] = { 1, 1},
},
},
- ["spell"] = function()
- return FALSE
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function() return device_nothing() end,
+ ["info"] = function() return device_nothing_info() end,
["desc"] = {
"It does nothing.",
}
@@ -209,15 +172,8 @@ DEVICE_LEBOHAUM = add_spell
["fail"] = 0,
["random"] = -1,
["activate"] = 3,
- ["spell"] = function()
- msg_print("You hear a little song in your head in some unknown tongue:")
- msg_print("'Avec le casque Lebohaum y a jamais d'anicroches, je parcours les dongeons,")
- msg_print("j'en prend plein la caboche. Avec le casque Lebohaum, tout ces monstres a la")
- msg_print("con, je leur met bien profond: c'est moi le maitre du dongeon!'")
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function() return device_lebohaum() end,
+ ["info"] = function() return device_lebohaum_info() end,
["desc"] = {
"sing a cheerful song",
}
@@ -233,14 +189,8 @@ DEVICE_MAGGOT = add_spell
["fail"] = 20,
["random"] = -1,
["activate"] = { 10, 50 },
- ["spell"] = function()
- local ret, dir = get_aim_dir()
- if ret == FALSE then return end
- return fire_ball(GF_TURN_ALL, dir, 40, 2)
- end,
- ["info"] = function()
- return "power 40 rad 2"
- end,
+ ["spell"] = function() return device_maggot() end,
+ ["info"] = function() return device_maggot_info() end,
["desc"] = {
"terrify",
}
@@ -266,12 +216,8 @@ DEVICE_HOLY_FIRE = add_spell
["max_level"] = { 35, 35 },
},
},
- ["spell"] = function()
- return project_los(GF_HOLY_FIRE, 50 + get_level(DEVICE_HOLY_FIRE, 300))
- end,
- ["info"] = function()
- return "dam "..(50 + get_level(DEVICE_HOLY_FIRE, 250))
- end,
+ ["spell"] = function() return device_holy_fire() end,
+ ["info"] = function() return device_holy_fire_info() end,
["desc"] = {
"The Holy Fire created by this staff will deeply(double damage) burn",
"all that is evil.",
@@ -290,52 +236,8 @@ DEVICE_ETERNAL_FLAME = add_spell
["fail"] = 0,
["random"] = -1,
["activate"] = { 0, 0 },
- ["spell"] = function(flame_item)
- local ret, item, obj
-
- ret, item = get_item("Which object do you want to imbue?",
- "You have no objects to imbue.",
- bor(USE_INVEN),
- function (obj)
- if obj.name1 > 0 or obj.name2 > 0 then return FALSE end
- if (obj.tval == TV_SWORD) and (obj.sval == SV_LONG_SWORD) then
- return TRUE
- elseif (obj.tval == TV_MSTAFF) and (obj.sval == SV_MSTAFF) then
- return TRUE
- elseif (obj.tval == TV_BOW) and (obj.sval == SV_HEAVY_XBOW) then
- return TRUE
- elseif (obj.tval == TV_DRAG_ARMOR) and (obj.sval == SV_DRAGON_POWER) then
- return TRUE
- end
- return FALSE
- end
- )
- if ret == FALSE then return FALSE end
-
- obj = get_object(item)
-
- if (obj.tval == TV_SWORD) and (obj.sval == SV_LONG_SWORD) then
- obj.name1 = 147
- elseif (obj.tval == TV_MSTAFF) and (obj.sval == SV_MSTAFF) then
- obj.name1 = 127
- elseif (obj.tval == TV_BOW) and (obj.sval == SV_HEAVY_XBOW) then
- obj.name1 = 152
- elseif (obj.tval == TV_DRAG_ARMOR) and (obj.sval == SV_DRAGON_POWER) then
- obj.name1 = 17
- end
- apply_magic(obj, -1, TRUE, TRUE, TRUE)
-
- obj.found = OBJ_FOUND_SELFMADE
-
- inven_item_increase(flame_item, -1)
- inven_item_describe(flame_item)
- inven_item_optimize(flame_item)
-
- return TRUE
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function(flame_item) return device_eternal_flame(flame_item) end,
+ ["info"] = function() return "" end,
["desc"] = {
"Imbuing an object with the eternal fire",
}
@@ -352,23 +254,8 @@ DEVICE_DURANDIL = add_spell
["fail"] = 0,
["random"] = -1,
["activate"] = 3,
- ["spell"] = function()
- msg_print("You hear a little song in your head in some unknown tongue:")
- msg_print("'Les epees Durandils sont forgees dans les mines par des nains.")
- msg_print("Avec ca c'est facile de tuer un troll avec une seule main. Pas besoin")
- msg_print("de super entrainement nis de niveau 28. Quand tu sors l'instrument")
- msg_print("c'est l'ennemi qui prend la fuite! Avec ton epee Durandil quand tu")
- msg_print("parcours les chemins, tu massacre sans peine les brigands et les gobelins,")
- msg_print("les rats geants, les ogres mutants, les zombies et les liches, tu les")
- msg_print("decoupe en tranches comme si c'etait des parts de quiches.")
- msg_print("Les epees Durandil! Les epees Durandil!")
- msg_print("Quand tu la sort dans un dongeon au moins t'as pas l'air debile.")
- msg_print("C'est l'arme des bourins qui savent etre subtils.")
- msg_print("Ne partez pas a l'aventure sans votre epee Durandil!'")
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function() return device_durandil() end,
+ ["info"] = function() return device_durandil_info() end,
["desc"] = {
"sing a cheerful song",
}
@@ -394,51 +281,9 @@ DEVICE_THUNDERLORDS = add_spell
["max_level"] = { 1, 1 },
},
},
- ["spell"] = function()
- if dun_level > 0 then
- msg_print("As you blow the horn a thunderlord pops out of nowhere and grabs you.")
- recall_player(0, 1)
- else
- msg_print("You cannot use it there.")
- end
- return TRUE
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function() return device_thunderlords() end,
+ ["info"] = function() return device_thunderlords_info() end,
["desc"] = {
"A thunderlord will appear to transport you quickly to the surface.",
}
}
-
---[[ Template
-DEVICE_ = add_spell
-{
- ["name"] = "",
- ["school"] = {SCHOOL_DEVICE},
- ["level"] = 1,
- ["mana"] = 2,
- ["mana_max"] = 15,
- ["fail"] = 10,
- ["random"] = -1,
- ["stick"] =
- {
- ["charge"] = { 10, 5 },
- [TV_STAFF] =
- {
- ["rarity"] = 7,
- ["base_level"] = { 1, 15 },
- ["max_level"] = { 25, 50 },
- },
- },
- ["spell"] = function()
- return FALSE
- end,
- ["info"] = function()
- return ""
- end,
- ["desc"] = {
- "",
- }
-}
-]]
diff --git a/src/externs.h b/src/externs.h
index 914cea73..5b935baa 100644
--- a/src/externs.h
+++ b/src/externs.h
@@ -1736,6 +1736,50 @@ char *nature_summon_animal_info();
bool_ *nature_grow_athelas();
char *nature_grow_athelas_info();
+extern s32b DEVICE_HEAL_MONSTER;
+extern s32b DEVICE_SPEED_MONSTER;
+extern s32b DEVICE_WISH;
+extern s32b DEVICE_SUMMON;
+extern s32b DEVICE_MANA;
+extern s32b DEVICE_NOTHING;
+extern s32b DEVICE_LEBOHAUM;
+extern s32b DEVICE_MAGGOT;
+extern s32b DEVICE_HOLY_FIRE;
+extern s32b DEVICE_ETERNAL_FLAME;
+extern s32b DEVICE_DURANDIL;
+extern s32b DEVICE_THUNDERLORDS;
+extern s32b DEVICE_RADAGAST;
+extern s32b DEVICE_VALAROMA;
+
+bool_ *device_heal_monster();
+char *device_heal_monster_info();
+bool_ *device_haste_monster();
+char *device_haste_monster_info();
+bool_ *device_wish();
+char *device_wish_info();
+bool_ *device_summon_monster();
+char *device_summon_monster_info();
+bool_ *device_mana();
+char *device_mana_info();
+bool_ *device_nothing();
+char *device_nothing_info();
+bool_ *device_lebohaum();
+char *device_lebohaum_info();
+bool_ *device_maggot();
+char *device_maggot_info();
+bool_ *device_holy_fire();
+char *device_holy_fire_info();
+bool_ *device_eternal_flame();
+char *device_eternal_flame_info();
+bool_ *device_durandil();
+char *device_durandil_info();
+bool_ *device_thunderlords();
+char *device_thunderlords_info();
+bool_ *device_radagast();
+char *device_radagast_info();
+bool_ *device_valaroma();
+char *device_valaroma_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 33459936..b31ff65b 100644
--- a/src/spells.pkg
+++ b/src/spells.pkg
@@ -2739,3 +2739,47 @@ bool_ *nature_summon_animal();
char *nature_summon_animal_info();
bool_ *nature_grow_athelas();
char *nature_grow_athelas_info();
+
+extern s32b DEVICE_HEAL_MONSTER;
+extern s32b DEVICE_SPEED_MONSTER;
+extern s32b DEVICE_WISH;
+extern s32b DEVICE_SUMMON;
+extern s32b DEVICE_MANA;
+extern s32b DEVICE_NOTHING;
+extern s32b DEVICE_LEBOHAUM;
+extern s32b DEVICE_MAGGOT;
+extern s32b DEVICE_HOLY_FIRE;
+extern s32b DEVICE_ETERNAL_FLAME;
+extern s32b DEVICE_DURANDIL;
+extern s32b DEVICE_THUNDERLORDS;
+extern s32b DEVICE_RADAGAST;
+extern s32b DEVICE_VALAROMA;
+
+bool_ *device_heal_monster();
+char *device_heal_monster_info();
+bool_ *device_haste_monster();
+char *device_haste_monster_info();
+bool_ *device_wish();
+char *device_wish_info();
+bool_ *device_summon_monster();
+char *device_summon_monster_info();
+bool_ *device_mana();
+char *device_mana_info();
+bool_ *device_nothing();
+char *device_nothing_info();
+bool_ *device_lebohaum();
+char *device_lebohaum_info();
+bool_ *device_maggot();
+char *device_maggot_info();
+bool_ *device_holy_fire();
+char *device_holy_fire_info();
+bool_ *device_eternal_flame();
+char *device_eternal_flame_info();
+bool_ *device_durandil();
+char *device_durandil_info();
+bool_ *device_thunderlords();
+char *device_thunderlords_info();
+bool_ *device_radagast();
+char *device_radagast_info();
+bool_ *device_valaroma();
+char *device_valaroma_info();
diff --git a/src/spells3.c b/src/spells3.c
index 2bef9931..6a45a1a3 100644
--- a/src/spells3.c
+++ b/src/spells3.c
@@ -118,6 +118,21 @@ s32b REGENERATION;
s32b SUMMONANNIMAL;
s32b GROW_ATHELAS = -1;
+s32b DEVICE_HEAL_MONSTER;
+s32b DEVICE_SPEED_MONSTER;
+s32b DEVICE_WISH;
+s32b DEVICE_SUMMON;
+s32b DEVICE_MANA;
+s32b DEVICE_NOTHING;
+s32b DEVICE_LEBOHAUM;
+s32b DEVICE_MAGGOT;
+s32b DEVICE_HOLY_FIRE;
+s32b DEVICE_ETERNAL_FLAME;
+s32b DEVICE_DURANDIL;
+s32b DEVICE_THUNDERLORDS;
+s32b DEVICE_RADAGAST = -1;
+s32b DEVICE_VALAROMA = -1;
+
/* 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
@@ -3527,3 +3542,359 @@ char *nature_grow_athelas_info()
{
return "";
}
+
+static int device_heal_monster_hp()
+{
+ return 20 + get_level_s(DEVICE_HEAL_MONSTER, 380);
+}
+
+bool_ *device_heal_monster()
+{
+ int dir;
+
+ if (!get_aim_dir(&dir))
+ {
+ return NO_CAST;
+ }
+
+ fire_ball(GF_OLD_HEAL, dir, device_heal_monster_hp(), 0);
+ return CAST;
+}
+
+char *device_heal_monster_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "heal %d",
+ device_heal_monster_hp());
+ return buf;
+}
+
+bool_ *device_haste_monster()
+{
+ int dir;
+
+ if (!get_aim_dir(&dir))
+ {
+ return NO_CAST;
+ }
+
+ fire_ball(GF_OLD_SPEED, dir, 1, 0);
+ return CAST;
+}
+
+char *device_haste_monster_info()
+{
+ return "speed +10";
+}
+
+bool_ *device_wish()
+{
+ make_wish();
+ return CAST;
+}
+
+char *device_wish_info()
+{
+ return "";
+}
+
+bool_ *device_summon_monster()
+{
+ int i;
+ for (i = 0; i < 4 + get_level_s(DEVICE_SUMMON, 30); i++)
+ {
+ summon_specific(p_ptr->py, p_ptr->px, dun_level, 0);
+ }
+ return CAST;
+}
+
+char *device_summon_monster_info()
+{
+ return "";
+}
+
+static int device_mana_pct()
+{
+ return 20 + get_level_s(DEVICE_MANA, 50);
+}
+
+bool_ *device_mana()
+{
+ increase_mana((p_ptr->msp * device_mana_pct()) / 100);
+ return CAST;
+}
+
+char *device_mana_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "restore %d%%",
+ device_mana_pct());
+ return buf;
+}
+
+bool_ *device_nothing()
+{
+ return CAST;
+}
+
+char *device_nothing_info()
+{
+ return "";
+}
+
+bool_ *device_lebohaum()
+{
+ msg_print("You hear a little song in your head in some unknown tongue:");
+ msg_print("'Avec le casque Lebohaum y a jamais d'anicroches, je parcours les dongeons,");
+ msg_print("j'en prend plein la caboche. Avec le casque Lebohaum, tout ces monstres a la");
+ msg_print("con, je leur met bien profond: c'est moi le maitre du dongeon!'");
+ return CAST;
+}
+
+char *device_lebohaum_info()
+{
+ return "";
+}
+
+bool_ *device_maggot()
+{
+ int dir;
+
+ if (!get_aim_dir(&dir))
+ {
+ return NO_CAST;
+ }
+
+ fire_ball(GF_TURN_ALL, dir, 40, 2);
+ return CAST;
+}
+
+char *device_maggot_info()
+{
+ return "power 40 rad 2";
+}
+
+static int holy_fire_damage()
+{
+ return 50 + get_level_s(DEVICE_HOLY_FIRE, 300);
+}
+
+bool_ *device_holy_fire()
+{
+ project_hack(GF_HOLY_FIRE, holy_fire_damage());
+ return CAST;
+}
+
+char *device_holy_fire_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "dam %d",
+ holy_fire_damage());
+ return buf;
+}
+
+static int get_eternal_artifact_idx(object_type *o_ptr)
+{
+ if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_LONG_SWORD)) {
+ return 147;
+ } else if ((o_ptr->tval == TV_MSTAFF) && (o_ptr->sval == SV_MSTAFF)) {
+ return 127;
+ } else if ((o_ptr->tval == TV_BOW) && (o_ptr->sval == SV_HEAVY_XBOW)) {
+ return 152;
+ } else if ((o_ptr->tval == TV_DRAG_ARMOR) && (o_ptr->sval == SV_DRAGON_POWER)) {
+ return 17;
+ }
+
+ if (game_module_idx == MODULE_THEME)
+ {
+ if ((o_ptr->tval == TV_HAFTED) && (o_ptr->sval == SV_LUCERN_HAMMER)) {
+ return 241;
+ } else if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_TRIDENT)) {
+ return 242;
+ } else if ((o_ptr->tval == TV_AXE) && (o_ptr->sval == SV_BROAD_AXE)) {
+ return 243;
+ } else if ((o_ptr->tval == TV_BOW) && (o_ptr->sval == SV_LONG_BOW)) {
+ return 245;
+ } else if ((o_ptr->tval == TV_BOOMERANG) && (o_ptr->sval == SV_BOOM_METAL)) {
+ return 247;
+ } else if ((o_ptr->tval == TV_BOW) && (o_ptr->sval == SV_SLING)) {
+ return 246;
+ } else if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_RAPIER)) {
+ return 244;
+ } else if ((o_ptr->tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_SPELL)) {
+ return 248;
+ }
+ }
+
+ /* Not usable */
+ return -1;
+}
+
+static bool_ eternal_flame_item_tester_hook(object_type *o_ptr)
+{
+ if ((o_ptr->name1 > 0) ||
+ (o_ptr->name2 > 0))
+ {
+ return FALSE;
+ }
+
+ return (get_eternal_artifact_idx(o_ptr) >= 0);
+}
+
+bool_ *device_eternal_flame(int flame_item)
+{
+ int item;
+ object_type *o_ptr = NULL;
+ int artifact_idx = -1;
+
+ item_tester_hook = eternal_flame_item_tester_hook;
+ if (!get_item(&item,
+ "Which object do you want to imbue?",
+ "You have no objects to imbue.",
+ USE_INVEN))
+ {
+ return FALSE;
+ }
+
+ /* Get the artifact idx */
+ artifact_idx = get_eternal_artifact_idx(o_ptr);
+ assert(artifact_idx >= 0);
+
+ /* Forge the item */
+ o_ptr = get_object(item);
+ o_ptr->name1 = artifact_idx;
+
+ apply_magic(o_ptr, -1, TRUE, TRUE, TRUE);
+
+ o_ptr->found = OBJ_FOUND_SELFMADE;
+
+ inven_item_increase(flame_item, -1);
+ inven_item_describe(flame_item);
+ inven_item_optimize(flame_item);
+
+ return CAST;
+}
+
+char *device_eternal_flame_info()
+{
+ return "";
+}
+
+bool_ *device_durandil()
+{
+ msg_print("You hear a little song in your head in some unknown tongue:");
+ msg_print("'Les epees Durandils sont forgees dans les mines par des nains.");
+ msg_print("Avec ca c'est facile de tuer un troll avec une seule main. Pas besoin");
+ msg_print("de super entrainement nis de niveau 28. Quand tu sors l'instrument");
+ msg_print("c'est l'ennemi qui prend la fuite! Avec ton epee Durandil quand tu");
+ msg_print("parcours les chemins, tu massacre sans peine les brigands et les gobelins,");
+ msg_print("les rats geants, les ogres mutants, les zombies et les liches, tu les");
+ msg_print("decoupe en tranches comme si c'etait des parts de quiches.");
+ msg_print("Les epees Durandil! Les epees Durandil!");
+ msg_print("Quand tu la sort dans un dongeon au moins t'as pas l'air debile.");
+ msg_print("C'est l'arme des bourins qui savent etre subtils.");
+ msg_print("Ne partez pas a l'aventure sans votre epee Durandil!'");
+ return CAST;
+}
+
+char *device_durandil_info()
+{
+ return "";
+}
+
+bool_ *device_thunderlords()
+{
+ switch (game_module_idx)
+ {
+ case MODULE_TOME:
+ {
+ if (dun_level > 0)
+ {
+ msg_print("As you blow the horn a thunderlord pops out of nowhere and grabs you.");
+ recall_player(0, 1);
+ }
+ else
+ {
+ msg_print("You cannot use it there.");
+ }
+ return CAST;
+ }
+
+ case MODULE_THEME:
+ {
+ if (dun_level > 0)
+ {
+ msg_print("As you blow the horn, an Eagle of Manwe appears overhead.");
+ recall_player(0, 1);
+ }
+ else
+ {
+ msg_print("You cannot use it there.");
+ }
+ return CAST;
+ }
+
+ default:
+ assert(FALSE);
+ return NO_CAST;
+ }
+}
+
+char *device_thunderlords_info()
+{
+ return "";
+}
+
+bool_ *device_radagast()
+{
+ cmsg_print(TERM_GREEN, "The staff's power cleanses you completely!");
+ remove_all_curse();
+ do_res_stat(A_STR, TRUE);
+ do_res_stat(A_CON, TRUE);
+ do_res_stat(A_DEX, TRUE);
+ do_res_stat(A_WIS, TRUE);
+ do_res_stat(A_INT, TRUE);
+ do_res_stat(A_CHR, TRUE);
+ restore_level();
+ // clean_corruptions(); TODO: Do we want to implement this?
+ hp_player(5000);
+ heal_insanity(5000);
+ set_poisoned(0);
+ set_blind(0);
+ set_confused(0);
+ set_image(0);
+ set_stun(0);
+ set_cut(0);
+ set_parasite(0, 0);
+
+ if (p_ptr->black_breath)
+ {
+ msg_print("The hold of the Black Breath on you is broken!");
+ }
+ p_ptr->black_breath = FALSE;
+
+ p_ptr->update |= PU_BONUS;
+ p_ptr->window |= PW_PLAYER;
+
+ return CAST;
+}
+
+char *device_radagast_info()
+{
+ return "";
+}
+
+bool_ *device_valaroma()
+{
+ int power = 5 * p_ptr->lev;
+ banish_evil(power);
+ return CAST;
+}
+
+char *device_valaroma_info()
+{
+ return "";
+}