diff options
Diffstat (limited to 'lib/core/powers.lua')
-rw-r--r-- | lib/core/powers.lua | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/lib/core/powers.lua b/lib/core/powers.lua new file mode 100644 index 00000000..839a921d --- /dev/null +++ b/lib/core/powers.lua @@ -0,0 +1,105 @@ +-- +-- Helper functions for magic powers +-- + +__magic_powers = {} + +function add_magic(m) + local i, ret + + if type(m.spell_list) ~= "table" then + error("add_magic called without a table") + end + + -- Ok iterate over all the powers to add + local index, p, max + + -- First, count them + max = 0 + for index, p in m.spell_list do + max = max + 1 + end + + -- Now register it + ret = {} + i = new_magic_power(max) + ret.spells = i + ret.max = max + ret.fail_fct = m.fail + if m.stat then + ret.stat = m.stat + else + ret.stat = A_INT + end + if m.get_level then + ret.get_current_level = m.get_level + else + ret.get_current_level = function() + return player.lev + end + end + + -- And add each spells + max = 0 + ret.info = {} + ret.spell = {} + for index, p in m.spell_list do + assert(p.name, "No name for the spell!") + assert(p.desc, "No desc for the spell!") + assert(p.mana, "No mana for the spell!") + assert(p.level, "No level for the spell!") + assert(p.fail, "No fail for the spell!") + assert(p.info, "No info for the spell!") + assert(p.spell, "No spell for the spell!") + + get_magic_power(i, max).name = p.name + get_magic_power(i, max).desc = p.desc + get_magic_power(i, max).mana_cost = p.mana + get_magic_power(i, max).min_lev = p.level + get_magic_power(i, max).fail = p.fail + ret.info[max] = p.info + ret.spell[max] = p.spell + + max = max + 1 + end + + return ret +end + +function __get_magic_info(power) + return __current_magic_power_info[power]() +end + +function execute_magic(m) + local sn, ret + + -- Ask for a spell + __current_magic_power_info = m.info + ret, sn = select_magic_power(0, m.spells, m.max, "__get_magic_info", m.get_current_level(), m.stat) + if (ret == FALSE) then return end + + -- Verify mana needs + if (get_magic_power(m.spells, sn).mana_cost > player.csp) then msg_print("Not enough mana!") return end + + -- Verify failure(second parameter is optional) + if m.fail then + __current_magic_power_fail = m.fail_fct + if (magic_power_sucess(get_magic_power(m.spells, sn), m.stat, "__current_magic_power_fail") == FALSE) then return end + else + if (magic_power_sucess(get_magic_power(m.spells, sn), m.stat) == FALSE) then return end + end + + -- Actually cast the spells + m.spell[sn]() + + -- use up some mana + increase_mana(-get_magic_power(m.spells, sn).mana_cost) +end + +-- Get the level of a power +function get_level_power(s, max, min) + if not max then max = 50 end + if not min then min = 1 end + + return value_scale(s.get_current_level(), 50, max, min) +end |