Módulo:I.Skills
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