summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBardur Arantsson <bardur@scientician.net>2012-05-12 14:55:09 +0200
committerBardur Arantsson <bardur@scientician.net>2012-05-12 15:50:48 +0200
commit2ead486354a2934f3d3e4e2ebb86e95653ee4b23 (patch)
tree3fe4545eb1c7cec805a92a08f3b5d0be9b0551da
parent363eb2f7405a66b496641d77aaa0b8a3d6c63384 (diff)
Lua: Move "Yavanna" spell functions to C
-rw-r--r--lib/mods/theme/scpt/s_yavann.lua77
-rw-r--r--lib/scpt/s_yavann.lua77
-rw-r--r--src/externs.h17
-rw-r--r--src/spells.pkg17
-rw-r--r--src/spells3.c192
5 files changed, 246 insertions, 134 deletions
diff --git a/lib/mods/theme/scpt/s_yavann.lua b/lib/mods/theme/scpt/s_yavann.lua
index 2f594e85..a2b2fe1c 100644
--- a/lib/mods/theme/scpt/s_yavann.lua
+++ b/lib/mods/theme/scpt/s_yavann.lua
@@ -12,15 +12,8 @@ YAVANNA_CHARM_ANIMAL = add_spell
["piety"] = TRUE,
["stat"] = A_WIS,
["random"] = SKILL_SPIRITUALITY,
- ["spell"] = function()
- local ret, dir = get_aim_dir()
- if ret == FALSE then return end
-
- return fire_ball(GF_CONTROL_ANIMAL, dir, 10 + get_level(YAVANNA_CHARM_ANIMAL, 170), get_level(YAVANNA_CHARM_ANIMAL, 2))
- end,
- ["info"] = function()
- return "power "..(10 + get_level(YAVANNA_CHARM_ANIMAL, 170)).." rad "..(get_level(YAVANNA_CHARM_ANIMAL, 2))
- end,
+ ["spell"] = function() return yavanna_charm_animal() end,
+ ["info"] = function() return yavanna_charm_animal_info() end,
["desc"] = {
"It tries to tame an animal",
}
@@ -38,13 +31,8 @@ YAVANNA_GROW_GRASS = add_spell
["piety"] = TRUE,
["stat"] = A_WIS,
["random"] = SKILL_SPIRITUALITY,
- ["spell"] = function()
- grow_grass(get_level(YAVANNA_GROW_GRASS, 4))
- return TRUE
- end,
- ["info"] = function()
- return "rad "..(get_level(YAVANNA_GROW_GRASS, 4))
- end,
+ ["spell"] = function() return yavanna_grow_grass() end,
+ ["info"] = function() return yavanna_grow_grass_info() end,
["desc"] = {
"Create a floor of grass around you. While on grass and praying",
"a worshipper of Yavanna will know a greater regeneration rate"
@@ -63,12 +51,8 @@ YAVANNA_TREE_ROOTS = add_spell
["piety"] = TRUE,
["stat"] = A_WIS,
["random"] = SKILL_SPIRITUALITY,
- ["spell"] = function()
- return set_roots(10 + get_level(YAVANNA_TREE_ROOTS, 30), 10 + get_level(YAVANNA_TREE_ROOTS, 60), 10 + get_level(YAVANNA_TREE_ROOTS, 20))
- end,
- ["info"] = function()
- return "dur "..(10 + get_level(YAVANNA_TREE_ROOTS, 30)).." AC "..(10 + get_level(YAVANNA_TREE_ROOTS, 60)).." dam "..(10 + get_level(YAVANNA_TREE_ROOTS, 20))
- end,
+ ["spell"] = function() return yavanna_tree_roots() end,
+ ["info"] = function() return yavanna_tree_roots_info() end,
["desc"] = {
"Creates roots deep in the floor from your feet, making you more stable and able",
"to make stronger attacks, but prevents any movement (even teleportation).",
@@ -88,21 +72,8 @@ YAVANNA_WATER_BITE = add_spell
["piety"] = TRUE,
["stat"] = A_WIS,
["random"] = SKILL_SPIRITUALITY,
- ["spell"] = function()
- local rad
-
- rad = 0
- if get_level(YAVANNA_WATER_BITE) >= 25 then rad = 1 end
-
- return set_project(randint(30) + 30 + get_level(YAVANNA_WATER_BITE, 150),
- GF_WATER,
- 10 + get_level(YAVANNA_WATER_BITE),
- rad,
- bor(PROJECT_STOP, PROJECT_KILL))
- end,
- ["info"] = function()
- return "dur "..(30 + get_level(YAVANNA_WATER_BITE, 150)).."+d30 dam "..(10 + get_level(YAVANNA_WATER_BITE)).."/blow"
- end,
+ ["spell"] = function() return yavanna_water_bite() end,
+ ["info"] = function() return yavanna_water_bite_info() end,
["desc"] = {
"Imbues your melee weapon with a natural stream of water",
"At level 25, it spreads over a 1 radius zone around your target"
@@ -121,36 +92,8 @@ YAVANNA_UPROOT = add_spell
["piety"] = TRUE,
["stat"] = A_WIS,
["random"] = SKILL_SPIRITUALITY,
- ["spell"] = function()
- local m_idx, x, y, c_ptr, ret, dir
-
- ret, dir = get_rep_dir()
- if ret == FALSE then return end
- y, x = explode_dir(dir)
- y, x = y + player.py, x + player.px
- c_ptr = cave(y, x)
-
- if c_ptr.feat == FEAT_TREES then
- cave_set_feat(y, x, FEAT_GRASS);
-
- -- Summon it
- y, x = find_position(y, x)
- m_idx = place_monster_one(y, x, test_monster_name("Ent"), 0, FALSE, MSTATUS_FRIEND)
-
- -- level it
- if m_idx ~= 0 then
- monster_set_level(m_idx, 30 + get_level(YAVANNA_UPROOT, 70))
- end
-
- msg_print("The tree awakes!");
- else
- msg_print("There is no tree there.")
- end
- return TRUE
- end,
- ["info"] = function()
- return "lev "..(30 + get_level(YAVANNA_UPROOT, 70))
- end,
+ ["spell"] = function() return yavanna_uproot() end,
+ ["info"] = function() return yavanna_uproot_info() end,
["desc"] = {
"Awakes a tree to help you battle the forces of Morgoth",
}
diff --git a/lib/scpt/s_yavann.lua b/lib/scpt/s_yavann.lua
index 2f594e85..a2b2fe1c 100644
--- a/lib/scpt/s_yavann.lua
+++ b/lib/scpt/s_yavann.lua
@@ -12,15 +12,8 @@ YAVANNA_CHARM_ANIMAL = add_spell
["piety"] = TRUE,
["stat"] = A_WIS,
["random"] = SKILL_SPIRITUALITY,
- ["spell"] = function()
- local ret, dir = get_aim_dir()
- if ret == FALSE then return end
-
- return fire_ball(GF_CONTROL_ANIMAL, dir, 10 + get_level(YAVANNA_CHARM_ANIMAL, 170), get_level(YAVANNA_CHARM_ANIMAL, 2))
- end,
- ["info"] = function()
- return "power "..(10 + get_level(YAVANNA_CHARM_ANIMAL, 170)).." rad "..(get_level(YAVANNA_CHARM_ANIMAL, 2))
- end,
+ ["spell"] = function() return yavanna_charm_animal() end,
+ ["info"] = function() return yavanna_charm_animal_info() end,
["desc"] = {
"It tries to tame an animal",
}
@@ -38,13 +31,8 @@ YAVANNA_GROW_GRASS = add_spell
["piety"] = TRUE,
["stat"] = A_WIS,
["random"] = SKILL_SPIRITUALITY,
- ["spell"] = function()
- grow_grass(get_level(YAVANNA_GROW_GRASS, 4))
- return TRUE
- end,
- ["info"] = function()
- return "rad "..(get_level(YAVANNA_GROW_GRASS, 4))
- end,
+ ["spell"] = function() return yavanna_grow_grass() end,
+ ["info"] = function() return yavanna_grow_grass_info() end,
["desc"] = {
"Create a floor of grass around you. While on grass and praying",
"a worshipper of Yavanna will know a greater regeneration rate"
@@ -63,12 +51,8 @@ YAVANNA_TREE_ROOTS = add_spell
["piety"] = TRUE,
["stat"] = A_WIS,
["random"] = SKILL_SPIRITUALITY,
- ["spell"] = function()
- return set_roots(10 + get_level(YAVANNA_TREE_ROOTS, 30), 10 + get_level(YAVANNA_TREE_ROOTS, 60), 10 + get_level(YAVANNA_TREE_ROOTS, 20))
- end,
- ["info"] = function()
- return "dur "..(10 + get_level(YAVANNA_TREE_ROOTS, 30)).." AC "..(10 + get_level(YAVANNA_TREE_ROOTS, 60)).." dam "..(10 + get_level(YAVANNA_TREE_ROOTS, 20))
- end,
+ ["spell"] = function() return yavanna_tree_roots() end,
+ ["info"] = function() return yavanna_tree_roots_info() end,
["desc"] = {
"Creates roots deep in the floor from your feet, making you more stable and able",
"to make stronger attacks, but prevents any movement (even teleportation).",
@@ -88,21 +72,8 @@ YAVANNA_WATER_BITE = add_spell
["piety"] = TRUE,
["stat"] = A_WIS,
["random"] = SKILL_SPIRITUALITY,
- ["spell"] = function()
- local rad
-
- rad = 0
- if get_level(YAVANNA_WATER_BITE) >= 25 then rad = 1 end
-
- return set_project(randint(30) + 30 + get_level(YAVANNA_WATER_BITE, 150),
- GF_WATER,
- 10 + get_level(YAVANNA_WATER_BITE),
- rad,
- bor(PROJECT_STOP, PROJECT_KILL))
- end,
- ["info"] = function()
- return "dur "..(30 + get_level(YAVANNA_WATER_BITE, 150)).."+d30 dam "..(10 + get_level(YAVANNA_WATER_BITE)).."/blow"
- end,
+ ["spell"] = function() return yavanna_water_bite() end,
+ ["info"] = function() return yavanna_water_bite_info() end,
["desc"] = {
"Imbues your melee weapon with a natural stream of water",
"At level 25, it spreads over a 1 radius zone around your target"
@@ -121,36 +92,8 @@ YAVANNA_UPROOT = add_spell
["piety"] = TRUE,
["stat"] = A_WIS,
["random"] = SKILL_SPIRITUALITY,
- ["spell"] = function()
- local m_idx, x, y, c_ptr, ret, dir
-
- ret, dir = get_rep_dir()
- if ret == FALSE then return end
- y, x = explode_dir(dir)
- y, x = y + player.py, x + player.px
- c_ptr = cave(y, x)
-
- if c_ptr.feat == FEAT_TREES then
- cave_set_feat(y, x, FEAT_GRASS);
-
- -- Summon it
- y, x = find_position(y, x)
- m_idx = place_monster_one(y, x, test_monster_name("Ent"), 0, FALSE, MSTATUS_FRIEND)
-
- -- level it
- if m_idx ~= 0 then
- monster_set_level(m_idx, 30 + get_level(YAVANNA_UPROOT, 70))
- end
-
- msg_print("The tree awakes!");
- else
- msg_print("There is no tree there.")
- end
- return TRUE
- end,
- ["info"] = function()
- return "lev "..(30 + get_level(YAVANNA_UPROOT, 70))
- end,
+ ["spell"] = function() return yavanna_uproot() end,
+ ["info"] = function() return yavanna_uproot_info() end,
["desc"] = {
"Awakes a tree to help you battle the forces of Morgoth",
}
diff --git a/src/externs.h b/src/externs.h
index 20567d99..c19a83ed 100644
--- a/src/externs.h
+++ b/src/externs.h
@@ -1699,6 +1699,23 @@ char *water_vapor_info();
bool_ *water_geyser();
char *water_geyser_info();
+extern s32b YAVANNA_CHARM_ANIMAL;
+extern s32b YAVANNA_GROW_GRASS;
+extern s32b YAVANNA_TREE_ROOTS;
+extern s32b YAVANNA_WATER_BITE;
+extern s32b YAVANNA_UPROOT;
+
+bool_ *yavanna_charm_animal();
+char *yavanna_charm_animal_info();
+bool_ *yavanna_grow_grass();
+char *yavanna_grow_grass_info();
+bool_ *yavanna_tree_roots();
+char *yavanna_tree_roots_info();
+bool_ *yavanna_water_bite();
+char *yavanna_water_bite_info();
+bool_ *yavanna_uproot();
+char *yavanna_uproot_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 779a63d4..73539162 100644
--- a/src/spells.pkg
+++ b/src/spells.pkg
@@ -2702,3 +2702,20 @@ bool_ *water_vapor();
char *water_vapor_info();
bool_ *water_geyser();
char *water_geyser_info();
+
+extern s32b YAVANNA_CHARM_ANIMAL;
+extern s32b YAVANNA_GROW_GRASS;
+extern s32b YAVANNA_TREE_ROOTS;
+extern s32b YAVANNA_WATER_BITE;
+extern s32b YAVANNA_UPROOT;
+
+bool_ *yavanna_charm_animal();
+char *yavanna_charm_animal_info();
+bool_ *yavanna_grow_grass();
+char *yavanna_grow_grass_info();
+bool_ *yavanna_tree_roots();
+char *yavanna_tree_roots_info();
+bool_ *yavanna_water_bite();
+char *yavanna_water_bite_info();
+bool_ *yavanna_uproot();
+char *yavanna_uproot_info();
diff --git a/src/spells3.c b/src/spells3.c
index 7fa9d728..c6702151 100644
--- a/src/spells3.c
+++ b/src/spells3.c
@@ -105,6 +105,12 @@ s32b ENTPOTION;
s32b VAPOR;
s32b GEYSER;
+s32b YAVANNA_CHARM_ANIMAL;
+s32b YAVANNA_GROW_GRASS;
+s32b YAVANNA_TREE_ROOTS;
+s32b YAVANNA_WATER_BITE;
+s32b YAVANNA_UPROOT;
+
/* 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
@@ -3182,3 +3188,189 @@ char *water_geyser_info()
sides);
return buf;
}
+
+static int charm_animal_power()
+{
+ return 10 + get_level_s(YAVANNA_CHARM_ANIMAL, 170);
+}
+
+static int charm_animal_radius()
+{
+ return get_level_s(YAVANNA_CHARM_ANIMAL, 2);
+}
+
+bool_ *yavanna_charm_animal()
+{
+ int dir;
+
+ if (!get_aim_dir(&dir))
+ {
+ return NO_CAST;
+ }
+
+ fire_ball(GF_CONTROL_ANIMAL,
+ dir,
+ charm_animal_power(),
+ charm_animal_radius());
+ return CAST;
+}
+
+char *yavanna_charm_animal_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "power %d rad %d",
+ charm_animal_power(),
+ charm_animal_radius());
+ return buf;
+}
+
+static int yavanna_grow_grass_radius()
+{
+ return get_level_s(YAVANNA_GROW_GRASS, 4);
+}
+
+bool_ *yavanna_grow_grass()
+{
+ grow_grass(yavanna_grow_grass_radius());
+ return CAST;
+}
+
+char *yavanna_grow_grass_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "rad %d",
+ yavanna_grow_grass_radius());
+ return buf;
+}
+
+static int tree_roots_duration()
+{
+ return 10 + get_level_s(YAVANNA_TREE_ROOTS, 30);
+}
+
+static int tree_roots_ac()
+{
+ return 10 + get_level_s(YAVANNA_TREE_ROOTS, 60);
+}
+
+static int tree_roots_damage()
+{
+ return 10 + get_level_s(YAVANNA_TREE_ROOTS, 20);
+}
+
+bool_ *yavanna_tree_roots()
+{
+ set_roots(tree_roots_duration(),
+ tree_roots_ac(),
+ tree_roots_damage());
+ return CAST;
+}
+
+char *yavanna_tree_roots_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "dur %d AC %d dam %d",
+ tree_roots_duration(),
+ tree_roots_ac(),
+ tree_roots_damage());
+ return buf;
+}
+
+static int water_bite_base_duration()
+{
+ return 30 + get_level_s(YAVANNA_WATER_BITE, 150);
+}
+
+static int water_bite_damage()
+{
+ return 10 + get_level_s(YAVANNA_WATER_BITE, 50);
+}
+
+bool_ *yavanna_water_bite()
+{
+ int rad = 0;
+
+ if (get_level_s(YAVANNA_WATER_BITE, 50) >= 25)
+ {
+ rad = 1;
+ }
+
+ set_project(randint(30) + water_bite_base_duration(),
+ GF_WATER,
+ water_bite_damage(),
+ rad,
+ PROJECT_STOP | PROJECT_KILL);
+ return CAST;
+}
+
+char *yavanna_water_bite_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "dur %d+d30 dam %d/blow",
+ water_bite_base_duration(),
+ water_bite_damage());
+ return buf;
+}
+
+static int uproot_mlevel()
+{
+ return 30 + get_level_s(YAVANNA_UPROOT, 70);
+}
+
+bool_ *yavanna_uproot()
+{
+ int dir, x, y;
+ cave_type *c_ptr;
+
+ if (!get_rep_dir(&dir))
+ {
+ return NO_CAST;
+ }
+
+ y = ddy[dir];
+ x = ddx[dir];
+
+ y += p_ptr->py;
+ x += p_ptr->px;
+
+ c_ptr = &cave[y][x];
+
+ if (c_ptr->feat == FEAT_TREES)
+ {
+ s16b m_idx;
+
+ cave_set_feat(y, x, FEAT_GRASS);
+
+ /* Summon it */
+ find_position(y, x, &y, &x);
+ m_idx = place_monster_one(y, x, test_monster_name("Ent"), 0, FALSE, MSTATUS_FRIEND);
+
+ /* level it */
+ if (m_idx != 0)
+ {
+ monster_set_level(m_idx, uproot_mlevel());
+ }
+
+ msg_print("The tree awakes!");
+ return CAST;
+ }
+ else
+ {
+ msg_print("There is no tree there.");
+ return NO_CAST;
+ }
+}
+
+char *yavanna_uproot_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "lev %d",
+ uproot_mlevel());
+ return buf;
+}
+