Módulo:I.Skills

De Wiki Gla
Revisão de 21h24min de 2 de janeiro de 2026 por Gurren1 (discussão | contribs)
Ir para navegação Ir para pesquisar

A documentação para este módulo pode ser criada em Módulo:I.Skills/doc

-- Módulo:I.Skills — skill(), skin() com suporte nativo a subskills recursivas
local p = {}

local utils = require("Módulo:I.Utils")
local trim = utils.trim
local colorize = utils.colorize

-- Fallback se colorize não existir
if not colorize or type(colorize) ~= "function" then
    colorize = function(txt)
        if not txt or txt == "" then
            return ""
        end
        -- Versão simplificada sem colorização
        return tostring(txt)
    end
end

local cUtils = require("Módulo:C.Utils")
local requireCharModule = cUtils.requireCharModule

-- Processa descrição (desc table → desc_i18n)
local function processDesc(desc)
    if not desc then return nil end
    if type(desc) == "string" then
        return { pt = colorize(desc) }
    end
    if type(desc) == "table" then
        local desc_i18n = {}
        for code, text in pairs(desc) do
            if type(text) == "string" and text ~= "" then
                desc_i18n[code] = colorize(text)
            end
        end
        return next(desc_i18n) and desc_i18n or nil
    end
    return nil
end

-- Processa weapon (aplica colorize nas descrições)
local function processWeapon(weapon)
    if not weapon or type(weapon) ~= "table" then
        return weapon
    end

    local processed = {}
    -- Copia todos os campos do weapon
    for k, v in pairs(weapon) do
        processed[k] = v
    end

    -- Processa descrição do weapon (se existir)
    if weapon.desc then
        processed.desc_i18n = processDesc(weapon.desc)
        -- Remove desc se desc_i18n foi criado (para evitar duplicação)
        if processed.desc_i18n then
            processed.desc = nil
        end
    end

    return processed
end

-- Processa subskills recursivamente (suporte ilimitado a níveis)
local function processSubskills(subskills, suborder)
    if not subskills or not suborder or type(subskills) ~= "table" or type(suborder) ~= "table" then
        return nil
    end

    local arr = {}
    for _, subName in ipairs(suborder) do
        local sub = subskills[subName]
        if type(sub) == "table" then
            local subObj = {
                name = subName,
                n = subName,
                icon = sub.icon or "",
                level = sub.level or "",
                energy = sub.energy,
                powerpve = sub.powerpve,
                powerpvp = sub.powerpvp,
                cooldown = sub.cooldown,
                video = sub.video or "",
                desc_i18n = processDesc(sub.desc),
                flags = sub.flags,
                weapon = processWeapon(sub.weapon),
                back = sub.back
            }

            -- RECURSÃO NATIVA: processa sub-subskills (e sub-sub-subskills, etc.)
            if type(sub.subskills) == "table" and type(sub.suborder) == "table" then
                subObj.subs = processSubskills(sub.subskills, sub.suborder)
                subObj.suborder = sub.suborder
            end

            table.insert(arr, subObj)
        end
    end

    return #arr > 0 and arr or nil
end

-- Gera JSON de skills a partir do módulo
function p.skill(frame)
    local parent = frame:getParent() or frame
    local args = parent.args or {}

    local moduleName = trim(args.module or "")
    if moduleName == "" then
        return "[]"
    end

    local data = requireCharModule(moduleName) or {}
    if not data.order or not data.skills then
        return "[]"
    end

    local skillsArr = {}

    -- Se houver forms, obtém a primeira forma (Brain Point por padrão)
    local firstForm = nil
    if type(data.forms) == "table" then
        -- SEMPRE tenta Brain Point primeiro (forma padrão inicial)
        firstForm = data.forms["Brain Point"]
        -- Se não tiver Brain Point, tenta em ordem: Kung Fu Point, Heavy Point
        if not firstForm then
            firstForm = data.forms["Kung Fu Point"]
        end
        if not firstForm then
            firstForm = data.forms["Heavy Point"]
        end
        -- Se ainda não tiver, pega qualquer uma disponível
        if not firstForm then
            for formName, formData in pairs(data.forms) do
                firstForm = formData
                break
            end
        end
    end

    -- Se houver forms, insere a primeira skill da forma ANTES do Change Form
    if firstForm and type(firstForm.skills) == "table" and type(firstForm.order) == "table" and #firstForm.order > 0 then
        local firstSkillName = firstForm.order[1]
        local formSk = firstForm.skills[firstSkillName]
        if type(formSk) == "table" then
            local formSkillObj = {
                name = firstSkillName,
                n = firstSkillName,
                icon = (formSk.icon and formSk.icon ~= "") and formSk.icon or "Nada.png",
                level = formSk.level or "NIVEL",
                energy = formSk.energy,
                powerpve = formSk.powerpve,
                powerpvp = formSk.powerpvp,
                cooldown = formSk.cooldown,
                video = formSk.video or "",
                desc_i18n = processDesc(formSk.desc),
                flags = formSk.flags,
                weapon = processWeapon(formSk.weapon)
            }
            if type(formSk.subskills) == "table" and type(formSk.suborder) == "table" then
                formSkillObj.subs = processSubskills(formSk.subskills, formSk.suborder)
                formSkillObj.suborder = formSk.suborder
            end
            table.insert(skillsArr, formSkillObj)
        end
    end

    -- Itera sobre order para manter ordem correta (skills fixas)
    local guardPointIndex = -1
    for idx, skillName in ipairs(data.order) do
        local sk = data.skills[skillName]
        if type(sk) == "table" then
            local skillObj = {
                name = skillName,
                n = skillName,
                icon = (sk.icon and sk.icon ~= "") and sk.icon or "Nada.png",
                level = sk.level or "NIVEL",
                energy = sk.energy,
                powerpve = sk.powerpve,
                powerpvp = sk.powerpvp,
                cooldown = sk.cooldown,
                video = sk.video or "",
                desc_i18n = processDesc(sk.desc),
                flags = sk.flags,
                weapon = processWeapon(sk.weapon),
                weaponicon = data.weaponicon,
                form_switch = sk.form_switch
            }

            -- Processa subskills recursivamente (suporte nativo ilimitado)
            if type(sk.subskills) == "table" and type(sk.suborder) == "table" then
                skillObj.subs = processSubskills(sk.subskills, sk.suborder)
                skillObj.suborder = sk.suborder
            end

            table.insert(skillsArr, skillObj)

            -- Se for "Change Form" e houver forms, adiciona a terceira skill da forma logo após
            if skillName == "Change Form" and firstForm and type(firstForm.skills) == "table" and type(firstForm.order) == "table" and #firstForm.order >= 2 then
                local thirdSkillName = firstForm.order[2] -- Segunda na ordem = terceira skill (1, 2, 3)
                local formSk = firstForm.skills[thirdSkillName]
                if type(formSk) == "table" then
                    local formSkillObj = {
                        name = thirdSkillName,
                        n = thirdSkillName,
                        icon = (formSk.icon and formSk.icon ~= "") and formSk.icon or "Nada.png",
                        level = formSk.level or "NIVEL",
                        energy = formSk.energy,
                        powerpve = formSk.powerpve,
                        powerpvp = formSk.powerpvp,
                        cooldown = formSk.cooldown,
                        video = formSk.video or "",
                        desc_i18n = processDesc(formSk.desc),
                        flags = formSk.flags,
                        weapon = processWeapon(formSk.weapon)
                    }
                    if type(formSk.subskills) == "table" and type(formSk.suborder) == "table" then
                        formSkillObj.subs = processSubskills(formSk.subskills, formSk.suborder)
                        formSkillObj.suborder = formSk.suborder
                    end
                    table.insert(skillsArr, formSkillObj)
                end
            end

            -- Guarda índice do Guard Point para inserir a quinta skill depois
            if skillName == "Guard Point" then
                guardPointIndex = #skillsArr
            end

            -- Se for "Guard Point" e houver forms, adiciona a quinta skill da forma logo após
            if skillName == "Guard Point" and firstForm and type(firstForm.skills) == "table" and type(firstForm.order) == "table" and #firstForm.order >= 3 then
                local fifthSkillName = firstForm.order[3] -- Terceira na ordem = quinta skill (1, 2, 3)
                local formSk = firstForm.skills[fifthSkillName]
                if type(formSk) == "table" then
                    local formSkillObj = {
                        name = fifthSkillName,
                        n = fifthSkillName,
                        icon = (formSk.icon and formSk.icon ~= "") and formSk.icon or "Nada.png",
                        level = formSk.level or "NIVEL",
                        energy = formSk.energy,
                        powerpve = formSk.powerpve,
                        powerpvp = formSk.powerpvp,
                        cooldown = formSk.cooldown,
                        video = formSk.video or "",
                        desc_i18n = processDesc(formSk.desc),
                        flags = formSk.flags,
                        weapon = processWeapon(formSk.weapon)
                    }
                    if type(formSk.subskills) == "table" and type(formSk.suborder) == "table" then
                        formSkillObj.subs = processSubskills(formSk.subskills, formSk.suborder)
                        formSkillObj.suborder = formSk.suborder
                    end
                    table.insert(skillsArr, formSkillObj)
                end
            end
        end
    end

    return mw.text.jsonEncode(skillsArr)
end

-- Gera JSON de forms a partir do módulo
function p.forms(frame)
    local parent = frame:getParent() or frame
    local args = parent.args or {}

    local moduleName = trim(args.module or "")
    if moduleName == "" then
        return "{}"
    end

    local data = requireCharModule(moduleName) or {}
    if not data.forms or type(data.forms) ~= "table" then
        return "{}"
    end

    local formsData = {}
    for formName, formData in pairs(data.forms) do
        if type(formData) == "table" and type(formData.skills) == "table" and type(formData.order) == "table" then
            local formSkills = {}
            for _, skillName in ipairs(formData.order) do
                local sk = formData.skills[skillName]
                if type(sk) == "table" then
                    local skillObj = {
                        name = skillName,
                        n = skillName,
                        icon = (sk.icon and sk.icon ~= "") and sk.icon or "Nada.png",
                        level = sk.level or "NIVEL",
                        energy = sk.energy,
                        powerpve = sk.powerpve,
                        powerpvp = sk.powerpvp,
                        cooldown = sk.cooldown,
                        video = sk.video or "",
                        desc_i18n = processDesc(sk.desc),
                        flags = sk.flags,
                        weapon = processWeapon(sk.weapon)
                    }
                    -- Processa subskills se houver
                    if type(sk.subskills) == "table" and type(sk.suborder) == "table" then
                        skillObj.subs = processSubskills(sk.subskills, sk.suborder)
                        skillObj.suborder = sk.suborder
                    end
                    table.insert(formSkills, skillObj)
                end
            end
            formsData[formName] = {
                order = formData.order,
                skills = formSkills
            }
        end
    end

    return mw.text.jsonEncode(formsData)
end

-- Gera JSON de skins a partir do módulo
function p.skin(frame)
    local parent = frame:getParent() or frame
    local args = parent.args or {}

    local moduleName = trim(args.module or "")
    if moduleName == "" then
        return "[]"
    end

    local data = requireCharModule(moduleName) or {}
    if not data.skins or type(data.skins) ~= "table" then
        return "[]"
    end

    -- Processa skins do módulo
    local skinsArr = {}
    for _, skin in ipairs(data.skins) do
        if type(skin) == "table" then
            local skinObj = {
                name = skin.name or "",
                sprite = skin.sprite or "",
                tooltip = skin.tooltip or "",
                offset_x = skin.offset_x,
                tile = skin.tile or "",
                tile_x = skin.tile_x,
                tile_y = skin.tile_y,
                youtube = skin.youtube
            }

            -- Se tooltip é table, converte para JSON string
            if type(skin.tooltip) == "table" then
                skinObj.tooltip = mw.text.jsonEncode(skin.tooltip)
            end

            table.insert(skinsArr, skinObj)
        end
    end

    return mw.text.jsonEncode(skinsArr)
end

return p