diff options
author | Bardur Arantsson <bardur@scientician.net> | 2012-05-12 14:55:09 +0200 |
---|---|---|
committer | Bardur Arantsson <bardur@scientician.net> | 2012-05-12 15:50:48 +0200 |
commit | 2ead486354a2934f3d3e4e2ebb86e95653ee4b23 (patch) | |
tree | 3fe4545eb1c7cec805a92a08f3b5d0be9b0551da | |
parent | 363eb2f7405a66b496641d77aaa0b8a3d6c63384 (diff) |
Lua: Move "Yavanna" spell functions to C
-rw-r--r-- | lib/mods/theme/scpt/s_yavann.lua | 77 | ||||
-rw-r--r-- | lib/scpt/s_yavann.lua | 77 | ||||
-rw-r--r-- | src/externs.h | 17 | ||||
-rw-r--r-- | src/spells.pkg | 17 | ||||
-rw-r--r-- | src/spells3.c | 192 |
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; +} + |