--
-- 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
