diff options
author | Bardur Arantsson <bardur@scientician.net> | 2012-05-10 03:28:52 +0200 |
---|---|---|
committer | Bardur Arantsson <bardur@scientician.net> | 2012-05-10 18:44:07 +0200 |
commit | 882afb262b6c01719b3c26c6b49d5ead50af84db (patch) | |
tree | 8cf82553fc2c3e728d7d01b816e032383e8c253c | |
parent | 656d66ee0e61c74f2730e2fffbea0304129d319b (diff) |
Lua: Move "Mind" spell functions to C
-rw-r--r-- | lib/scpt/s_mind.lua | 60 | ||||
-rw-r--r-- | src/externs.h | 14 | ||||
-rw-r--r-- | src/spells.pkg | 14 | ||||
-rw-r--r-- | src/spells3.c | 165 |
4 files changed, 201 insertions, 52 deletions
diff --git a/lib/scpt/s_mind.lua b/lib/scpt/s_mind.lua index d1b25e9e..7f24709b 100644 --- a/lib/scpt/s_mind.lua +++ b/lib/scpt/s_mind.lua @@ -18,22 +18,8 @@ CHARM = add_spell ["max_level"] = { 20, 40 }, }, }, - ["spell"] = function() - if get_level(CHARM, 50) >= 35 then - return project_los(GF_CHARM, 10 + get_level(CHARM, 150)) - elseif get_level(CHARM, 50) >= 15 then - local ret, dir = get_aim_dir() - if ret == FALSE then return end - return fire_ball(GF_CHARM, dir, 10 + get_level(CHARM, 150), 3) - else - local ret, dir = get_aim_dir() - if ret == FALSE then return end - return fire_bolt(GF_CHARM, dir, 10 + get_level(CHARM, 150)) - end - end, - ["info"] = function() - return "power "..(10 + get_level(CHARM, 150)) - end, + ["spell"] = function() return mind_charm() end, + ["info"] = function() return mind_charm_info() end, ["desc"] = { "Tries to manipulate the mind of a monster to make it friendly", "At level 15 it turns into a ball", @@ -59,22 +45,8 @@ CONFUSE = add_spell ["max_level"] = { 20, 40 }, }, }, - ["spell"] = function() - if get_level(CONFUSE, 50) >= 35 then - return project_los(GF_OLD_CONF, 10 + get_level(CONFUSE, 150)) - elseif get_level(CONFUSE, 50) >= 15 then - local ret, dir = get_aim_dir() - if ret == FALSE then return end - return fire_ball(GF_OLD_CONF, dir, 10 + get_level(CONFUSE, 150), 3) - else - local ret, dir = get_aim_dir() - if ret == FALSE then return end - return fire_bolt(GF_OLD_CONF, dir, 10 + get_level(CONFUSE, 150)) - end - end, - ["info"] = function() - return "power "..(10 + get_level(CONFUSE, 150)) - end, + ["spell"] = function() return mind_confuse() end, + ["info"] = function() return mind_confuse_info() end, ["desc"] = { "Tries to manipulate the mind of a monster to confuse it", "At level 15 it turns into a ball", @@ -91,12 +63,8 @@ ARMOROFFEAR = add_spell ["mana_max"] = 50, ["fail"] = 35, ["inertia"] = { 2, 20 }, - ["spell"] = function() - return set_shield(randint(10) + 10 + get_level(ARMOROFFEAR, 100), 10, SHIELD_FEAR, 1 + get_level(ARMOROFFEAR, 7), 5 + get_level(ARMOROFFEAR, 20)) - end, - ["info"] = function() - return "dur "..(10 + get_level(ARMOROFFEAR, 100)).." power "..(1 + get_level(ARMOROFFEAR, 7)).."d"..(5 + get_level(ARMOROFFEAR, 20)) - end, + ["spell"] = function() return mind_armor_of_fear() end, + ["info"] = function() return mind_armor_of_fear_info() end, ["desc"] = { "Creates a shield of pure fear around you. Any monster attempting to hit you", "must save or flee", @@ -111,20 +79,8 @@ STUN = add_spell ["mana"] = 10, ["mana_max"] = 90, ["fail"] = 45, - ["spell"] = function() - if get_level(STUN, 50) >= 20 then - local ret, dir = get_aim_dir() - if ret == FALSE then return end - return fire_ball(GF_STUN, dir, 10 + get_level(STUN, 150), 3) - else - local ret, dir = get_aim_dir() - if ret == FALSE then return end - return fire_bolt(GF_STUN, dir, 10 + get_level(STUN, 150)) - end - end, - ["info"] = function() - return "power "..(10 + get_level(STUN, 150)) - end, + ["spell"] = function() return mind_stun() end, + ["info"] = function() return mind_stun_info() end, ["desc"] = { "Tries to manipulate the mind of a monster to stun it", "At level 20 it turns into a ball", diff --git a/src/externs.h b/src/externs.h index fa50cac8..fdcc1562 100644 --- a/src/externs.h +++ b/src/externs.h @@ -1627,6 +1627,20 @@ void meta_inertia_control_timer_callback(); void meta_inertia_control_calc_mana(int *msp); void meta_inertia_control_hook_birth_objects(); +extern s32b CHARM; +extern s32b CONFUSE; +extern s32b ARMOROFFEAR; +extern s32b STUN; + +bool_ *mind_charm(); +char *mind_charm_info(); +bool_ *mind_confuse(); +char *mind_confuse_info(); +bool_ *mind_armor_of_fear(); +char *mind_armor_of_fear_info(); +bool_ *mind_stun(); +char *mind_stun_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 63e27f73..ca88202e 100644 --- a/src/spells.pkg +++ b/src/spells.pkg @@ -2632,3 +2632,17 @@ bool_ *meta_tracker(); char *meta_tracker_info(); bool_ *meta_inertia_control(); char *meta_inertia_control_info(); + +extern s32b CHARM; +extern s32b CONFUSE; +extern s32b ARMOROFFEAR; +extern s32b STUN; + +bool_ *mind_charm(); +char *mind_charm_info(); +bool_ *mind_confuse(); +char *mind_confuse_info(); +bool_ *mind_armor_of_fear(); +char *mind_armor_of_fear_info(); +bool_ *mind_stun(); +char *mind_stun_info(); diff --git a/src/spells3.c b/src/spells3.c index 47abba72..a84f56bd 100644 --- a/src/spells3.c +++ b/src/spells3.c @@ -80,6 +80,12 @@ s32b TRACKER; s32b INERTIA_CONTROL; timer_type *TIMER_INERTIA_CONTROL = 0; +s32b CHARM; +s32b CONFUSE; +s32b ARMOROFFEAR; +s32b STUN; + + /* 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). */ @@ -2459,3 +2465,162 @@ void meta_inertia_control_calc_mana(int *msp) } } } + +static int mind_charm_power() +{ + return 10 + get_level_s(CHARM, 150); +} + +bool_ *mind_charm() +{ + int pwr = mind_charm_power(); + int level = get_level_s(CHARM, 50); + + if (level >= 35) + { + project_hack(GF_CHARM, pwr); + } + else + { + int dir; + if (!get_aim_dir(&dir)) + { + return NO_CAST; + } + + if (level >= 15) + { + fire_ball(GF_CHARM, dir, pwr, 3); + } + else + { + fire_bolt(GF_CHARM, dir, pwr); + } + } + + return CAST; +} + +char *mind_charm_info() +{ + static char buf[128]; + sprintf(buf, + "power %d", + mind_charm_power()); + return buf; +} + +static int mind_confuse_power() +{ + return 10 + get_level_s(CONFUSE, 150); +} + +bool_ *mind_confuse() +{ + int pwr = mind_confuse_power(); + int level = get_level_s(CONFUSE, 50); + + if (level >= 35) + { + project_hack(GF_OLD_CONF, pwr); + } + else + { + int dir; + if (!get_aim_dir(&dir)) + { + return NO_CAST; + } + + if (level >= 15) + { + fire_ball(GF_OLD_CONF, dir, pwr, 3); + } + else + { + fire_bolt(GF_OLD_CONF, dir, pwr); + } + } + + return CAST; +} + +char *mind_confuse_info() +{ + static char buf[128]; + sprintf(buf, + "power %d", + mind_confuse_power()); + return buf; +} + +static int mind_armor_of_fear_base_duration() +{ + return 10 + get_level_s(ARMOROFFEAR, 100); +} + +static int mind_armor_of_fear_power_sides() +{ + return 1 + get_level_s(ARMOROFFEAR, 7); +} + +static int mind_armor_of_fear_power_dice() +{ + return 5 + get_level_s(ARMOROFFEAR, 20); +} + +bool_ *mind_armor_of_fear() +{ + set_shield(randint(10) + mind_armor_of_fear_base_duration(), + 10, + SHIELD_FEAR, + mind_armor_of_fear_power_sides(), + mind_armor_of_fear_power_dice()); + return CAST; +} + +char *mind_armor_of_fear_info() +{ + static char buf[128]; + sprintf(buf, + "dur %d+d10 power %dd%d", + mind_armor_of_fear_base_duration(), + mind_armor_of_fear_power_sides(), + mind_armor_of_fear_power_dice()); + return buf; +} + +static int mind_stun_power() +{ + return 10 + get_level_s(STUN, 150); +} + +bool_ *mind_stun() +{ + int dir; + + if (!get_aim_dir(&dir)) + { + return NO_CAST; + } + + if (get_level_s(STUN, 50) >= 20) + { + fire_ball(GF_STUN, dir, mind_stun_power(), 3); + } + else + { + fire_bolt(GF_STUN, dir, mind_stun_power()); + } + + return CAST; +} + +char *mind_stun_info() +{ + static char buf[128]; + sprintf(buf, + "power %d", + mind_stun_power()); + return buf; +} |