Módulo:ChestReward
Ir para navegação
Ir para pesquisar
A documentação para este módulo pode ser criada em Módulo:ChestReward/doc
local p = {}
local Item = require("Módulo:Item")
local BAU_IMAGENS = {
comum = 'CommonChest.png',
ouro = 'GoldChest.png'
}
local function formatNumber(num)
num = tonumber(num) or 0
if num >= 1e9 then
return string.format("%.0f", num / 1e6) .. "KKK"
elseif num >= 1e6 then
return string.format("%.0f", num / 1e6) .. "KK"
elseif num >= 1e4 then
return string.format("%.0f", num / 1e3) .. "K"
else
local s = tostring(num)
return s:reverse():gsub("(%d%d%d)", "%1,"):reverse():gsub("^,", "")
end
end
local function parseItemEntry(entry)
entry = mw.text.trim(entry)
if entry == "" then return nil, nil end
local ident, qtdStr
if entry:find(";") then
ident, qtdStr = entry:match("^(.-)%s*;%s*(%d+)$")
else
ident, qtdStr = entry:match("^(.-)%s*:%s*(%d+)$")
end
if not ident or not qtdStr then return nil, nil end
return mw.text.trim(ident), tonumber(qtdStr)
end
local function renderRewards(itensRaw, lang)
if not itensRaw or itensRaw == "" then return "" end
local parts = {}
for entry in mw.text.gsplit(itensRaw, ",", true) do
local ident, qtdNum = parseItemEntry(entry)
if ident and qtdNum then
local item = Item.resolve(ident)
if not item then
item = {
id = 0,
image = ident:match("%.%w+$") and ident or (ident .. ".png"),
names = { pt = ident, en = ident },
category = "unknown"
}
end
local qtdFormatada = formatNumber(qtdNum)
parts[#parts + 1] = Item.renderOne(item, qtdFormatada, lang, {
showTooltip = true,
showCount = true
})
end
end
return table.concat(parts)
end
function p.render(frame)
local args = frame:getParent().args
local nome = mw.text.trim(args['nome'] or '')
local lang = mw.text.trim(args['lang'] or 'pt')
local root = mw.html.create('div'):attr('class', 'lk-wrap')
root:tag('span'):attr('class', 'lk-theme-btn'):wikitext('☾ Dark')
if nome ~= '' then
root:tag('div'):attr('class', 'lk-titulo'):wikitext(nome)
end
local baus = {}
local i = 1
while true do
local tipo = mw.text.trim(args['bau' .. i .. 'tipo'] or '')
if tipo == '' then break end
baus[#baus + 1] = i
i = i + 1
end
if #baus == 0 then return tostring(root) end
local tabs = root:tag('div'):attr('class', 'lk-tabs')
for idx, n in ipairs(baus) do
local tipo = mw.text.trim(args['bau' .. n .. 'tipo'] or '')
local tabImg = BAU_IMAGENS[tipo] or ''
local tab = tabs:tag('span')
:attr('class', idx == 1 and 'lk-tab active' or 'lk-tab')
:attr('data-tab', 'b' .. n)
if tabImg ~= '' then
tab:node(mw.html.create(''):wikitext('[[File:' .. tabImg .. '|20px|link=]]'))
end
tab:tag('span'):wikitext('Baú ' .. string.format('%02d', n))
end
for idx, n in ipairs(baus) do
local px = 'bau' .. n
local tipo = mw.text.trim(args[px .. 'tipo'] or '')
local itens = mw.text.trim(args[px .. 'itens'] or '')
local video = mw.text.trim(args[px .. 'video'] or '')
local rota = mw.text.trim(args[px .. 'rota'] or '')
local panel = root:tag('div')
:attr('class', idx == 1 and 'lk-panel active' or 'lk-panel')
:attr('data-panel', 'b' .. n)
local rsec = panel:tag('div')
rsec:tag('div'):attr('class', 'lk-slabel'):wikitext('Recompensas')
local grid = rsec:tag('div'):attr('class', 'lk-rewards reward-items')
grid:wikitext(renderRewards(itens, lang))
if video ~= '' or rota ~= '' then
panel:tag('div'):attr('class', 'lk-divider')
local csec = panel:tag('div')
csec:tag('div'):attr('class', 'lk-slabel'):wikitext('Como chegar')
local ctabs = csec:tag('div'):attr('class', 'lk-ctabs')
if video ~= '' then
ctabs:tag('span')
:attr('class', 'lk-ctab active')
:attr('data-ctab', 'v' .. n)
:wikitext('Vídeo')
end
if rota ~= '' then
ctabs:tag('span')
:attr('class', video ~= '' and 'lk-ctab' or 'lk-ctab active')
:attr('data-ctab', 'r' .. n)
:wikitext('Imagem')
end
if video ~= '' then
local vpanel = csec:tag('div')
:attr('class', 'lk-cpanel active')
:attr('data-cpanel', 'v' .. n)
local mwrap = vpanel:tag('div'):attr('class', 'lk-media-wrap')
mwrap:attr('data-video', video)
end
if rota ~= '' then
local rpanel = csec:tag('div')
:attr('class', video ~= '' and 'lk-cpanel' or 'lk-cpanel active')
:attr('data-cpanel', 'r' .. n)
local slider = rpanel:tag('div'):attr('class', 'lk-slider')
local track = slider:tag('div'):attr('class', 'lk-slider-track')
local imgs = mw.text.split(rota, '%s*,%s*')
local total = 0
for _, imgname in ipairs(imgs) do
imgname = mw.text.trim(imgname)
if imgname ~= '' then
local slide = track:tag('div'):attr('class', 'lk-slide')
slide:node(mw.html.create(''):wikitext('[[File:' .. imgname .. '|link=]]'))
total = total + 1
end
end
if total > 1 then
slider:tag('span')
:attr('class', 'lk-slide-btn lk-slide-prev')
:attr('aria-label', 'anterior')
:wikitext('<')
slider:tag('span')
:attr('class', 'lk-slide-btn lk-slide-next')
:attr('aria-label', 'proximo')
:wikitext('>')
slider:tag('span')
:attr('class', 'lk-slide-counter')
:attr('data-total', tostring(total))
:wikitext('1 / ' .. total)
end
end
end
end
return tostring(root)
end
return p