diff options
author | Bardur Arantsson <bardur@scientician.net> | 2012-05-13 10:55:44 +0200 |
---|---|---|
committer | Bardur Arantsson <bardur@scientician.net> | 2012-05-13 14:24:52 +0200 |
commit | 806d9737befef6ca878befbcddeb30634ce62083 (patch) | |
tree | a58a638f77664b8a2235cbefd8ad71cb1c7602be | |
parent | 2d57accf3a3c68e7eb41571eadf54ca2c7c4607f (diff) |
Lua: Move "device" spell functions to C
-rw-r--r-- | lib/mods/theme/scpt/s_stick.lua | 252 | ||||
-rw-r--r-- | lib/scpt/s_stick.lua | 203 | ||||
-rw-r--r-- | src/externs.h | 44 | ||||
-rw-r--r-- | src/spells.pkg | 44 | ||||
-rw-r--r-- | src/spells3.c | 371 |
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 ""; +} |