summaryrefslogtreecommitdiff
path: root/lib/core/powers.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lib/core/powers.lua')
-rw-r--r--lib/core/powers.lua105
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