Mudanças entre as edições de "Módulo:Gb"

De Wiki Gla
Ir para navegação Ir para pesquisar
 
(39 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
-- [[Module:Gb]] — Calculadora de custos de tiers/estrelas
local p = {}


function p.main(frame)
    local args = frame:getParent().args


-- ============== CORE ==================
    local normal_nivel    = mw.text.trim(args['normal_nivel']   or '140')
local function computePath(ti, si, tf, sf)
    local normal_equip    = mw.text.trim(args['normal_equip']    or 'Set +8')
local steps, total = {}, { berry=0, frag=0, pedras=0 }
    local hard_personagem = mw.text.trim(args['hard_personagem'] or 'personagem 4 ou 5 estrelas (Diamante)')
local iTier, iStar = ti, si
    local hard_equip      = mw.text.trim(args['hard_equip']      or 'Set +16')
local function push(step) steps[#steps+1]=step; total=addCost(total, step.custo) end
while (iTier < tf) or (iTier == tf and iStar < sf) do
if iStar < 5 and (iTier < tf or (iTier == tf and iStar < sf)) then
local tierName = getTierName(iTier)
local toStar = iStar + 1
push({ tipo='estrela', tier=tierName, de=iStar, para=toStar, custo=starCost(tierName, toStar) })
iStar = toStar
else
if iTier >= #CONFIG.tiers then break end
local fromTier = getTierName(iTier)
push({ tipo='tier', de=fromTier, para=getTierName(iTier+1), custo=tierUpCost(fromTier) })
iTier = iTier + 1; iStar = 0
end
end
return steps, total
end


    local root = mw.html.create('div')
    root:addClass('gb-wrap')


-- ============= RENDER =================
    -- CSS via TemplateStyles (recomendado) ou inline
local function pill(class, value)
    -- Botões (tabs)
return string.format('<span class="gb-pill %s">%s</span>', class, value)
    local btns = root:tag('div'):addClass('gb-btns')
end


    btns:tag('button')
        :addClass('gb-btn'):addClass('active')
        :attr('onclick', "gbSwitch('n',this)")
        :wikitext('Normal ')
        :tag('span'):addClass('gb-badge'):addClass('badge-n')
        :wikitext('Nível ' .. normal_nivel)


local function renderTable(steps, total, opts)
    btns:tag('button')
local h = mw.html.create('div'):addClass('calc-tier')
        :addClass('gb-btn')
if opts.titulo and opts.titulo ~= '' then h:tag('h3'):wikitext(opts.titulo) end
        :attr('onclick', "gbSwitch('h',this)")
local tbl = h:tag('table'):addClass('wikitable'):css('width','100%')
        :wikitext('Hard ')
local tr = tbl:tag('tr')
        :tag('span'):addClass('gb-badge'):addClass('badge-h')
tr:tag('th'):wikitext('Passo'); tr:tag('th'):wikitext('Ação')
        :wikitext(hard_equip)
tr:tag('th'):wikitext(CONFIG.labels.berry)
tr:tag('th'):wikitext(CONFIG.labels.frag)
tr:tag('th'):wikitext(CONFIG.labels.pedras)
for i, st in ipairs(steps) do
local r = tbl:tag('tr')
r:tag('td'):wikitext(i)
if st.tipo == 'estrela' then r:tag('td'):wikitext(('Tier %s: %d → %d★'):format(st.tier, st.de, st.para))
else r:tag('td'):wikitext(('Subir de %s → %s'):format(st.de, st.para)) end
r:tag('td'):wikitext(pill('gold', formatNumber(st.custo.berry, opts.sep)))
r:tag('td'):wikitext(pill('green', formatNumber(st.custo.frag, opts.sep)))
r:tag('td'):wikitext(formatNumber(st.custo.pedras, opts.sep))
end
local box = h:tag('div'):addClass('calc-tier-total'):css('margin-top','8px')
box:wikitext(('<b>Total:</b> %s • %s • %s: %s')
:format(pill('gold', formatNumber(total.berry, opts.sep)), pill('green', formatNumber(total.frag, opts.sep)), CONFIG.labels.pedras, formatNumber(total.pedras, opts.sep)))
return tostring(h)
end
 
 
local function renderCompact(total, opts)
local h = mw.html.create('div'):addClass('calc-tier')
if opts.titulo and opts.titulo ~= '' then h:tag('h3'):wikitext(opts.titulo) end
local box = h:tag('div'):addClass('calc-tier-total')
box:wikitext(('<b>Total:</b> %s • %s • %s: %s')
:format(pill('gold', formatNumber(total.berry, opts.sep)), pill('green', formatNumber(total.frag, opts.sep)), CONFIG.labels.pedras, formatNumber(total.pedras, opts.sep)))
return tostring(h)
end


    -- Painel Normal
    local pn = root:tag('div'):addClass('gb-panel'):addClass('active'):attr('id', 'gbpanel-n')
    pn:tag('div'):addClass('gb-title'):wikitext('Requisitos — Normal')
    local ln = pn:tag('ul'):addClass('gb-list')
    ln:tag('li')
        :tag('span'):addClass('gb-dot'):addClass('dot-n'):done()
        :tag('span'):wikitext('Nível mínimo: '):tag('b'):wikitext(normal_nivel)
    ln:tag('li')
        :tag('span'):addClass('gb-dot'):addClass('dot-n'):done()
        :tag('span'):wikitext('Equipamento recomendado: '):tag('b'):wikitext(normal_equip)


-- ============= ENTRY ==================
    -- Painel Hard
function p.calcular(frame)
    local ph = root:tag('div'):addClass('gb-panel'):attr('id', 'gbpanel-h')
local args = getArgs(frame)
    ph:tag('div'):addClass('gb-title'):wikitext('Requisitos — Hard')
local inicioTier = args.inicio_tier or args.de_tier or args.tier_inicial
    local lh = ph:tag('ul'):addClass('gb-list')
local fimTier = args.fim_tier or args.ate_tier or args.tier_final
    lh:tag('li')
if not inicioTier or not fimTier then return "Erro: defina 'inicio_tier' e 'fim_tier'." end
        :tag('span'):addClass('gb-dot'):addClass('dot-h'):done()
        :tag('span'):wikitext('Recomendado utilizar um '):tag('b'):wikitext(hard_personagem)
    lh:tag('li')
        :tag('span'):addClass('gb-dot'):addClass('dot-h'):done()
        :tag('span'):wikitext('Equipamento recomendado: '):tag('b'):wikitext(hard_equip)


    -- Script
    local script = mw.html.create('script')
    script:wikitext([[
function gbSwitch(tab,btn){
['n','h'].forEach(function(t){document.getElementById('gbpanel-'+t).classList.remove('active');});
document.querySelectorAll('.gb-btn').forEach(function(b){b.classList.remove('active');});
document.getElementById('gbpanel-'+tab).classList.add('active');
btn.classList.add('active');
}]])


local ti, tf = tierIndex(inicioTier), tierIndex(fimTier)
    -- CSS inline
if not ti or not tf then return 'Erro: tier inválido. Use: bronze, prata, ouro, diamante.' end
    local style = mw.html.create('style')
    style:wikitext([[
.gb-wrap{font-family:sans-serif;max-width:600px}
.gb-btns{display:flex;border-bottom:2px solid #a2a9b1;margin-bottom:0}
.gb-btn{padding:8px 22px;font-size:14px;font-weight:bold;color:#54595d;background:transparent;border:none;border-bottom:3px solid transparent;margin-bottom:-2px;cursor:pointer;display:flex;align-items:center;gap:6px}
.gb-btn:hover{color:#202122}
.gb-btn.active{color:#202122;border-bottom-color:#3680b0}
.gb-badge{font-size:11px;padding:2px 8px;border-radius:20px;font-weight:bold}
.badge-n{background:#ddeeff;color:#185FA5}
.badge-h{background:#fce8e8;color:#a32d2d}
.gb-panel{display:none;padding:14px 2px}
.gb-panel.active{display:block}
.gb-title{font-size:11px;font-weight:bold;color:#72777d;text-transform:uppercase;letter-spacing:.06em;margin-bottom:10px}
.gb-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px}
.gb-list li{display:flex;align-items:flex-start;gap:8px;font-size:14px;color:#202122;line-height:1.5}
.gb-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0;margin-top:5px}
.dot-n{background:#3680b0}
.dot-h{background:#e24b4a}
@media(max-width:480px){.gb-btn{padding:8px 14px;font-size:13px}}]])


 
    return tostring(style) .. tostring(root) .. tostring(script)
local inicioEst = clamp(args.inicio_estrela or 0, 0, 5)
local fimEst = clamp(args.fim_estrela or 0, 0, 5)
if (ti > tf) or (ti == tf and inicioEst > fimEst) then return 'Erro: o alvo precisa ser maior que o estado inicial.' end
 
 
local steps, total = computePath(ti, inicioEst, tf, fimEst)
 
 
local layout = norm(args.layout or '')
local mostrarTabela = yesno(args.mostrar_tabela ~= 'nao') -- compat
if layout == '' then layout = mostrarTabela and 'tabela' or 'compacto' end
 
 
local opts = { titulo = args.titulo, sep = args.separador_milhar or '.' }
if layout == 'compacto' then return renderCompact(total, opts) end
return renderTable(steps, total, opts)
end
end


return p
return p

Edição atual tal como às 04h47min de 17 de março de 2026

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

local p = {}

function p.main(frame)
    local args = frame:getParent().args

    local normal_nivel    = mw.text.trim(args['normal_nivel']    or '140')
    local normal_equip    = mw.text.trim(args['normal_equip']    or 'Set +8')
    local hard_personagem = mw.text.trim(args['hard_personagem'] or 'personagem 4 ou 5 estrelas (Diamante)')
    local hard_equip      = mw.text.trim(args['hard_equip']      or 'Set +16')

    local root = mw.html.create('div')
    root:addClass('gb-wrap')

    -- CSS via TemplateStyles (recomendado) ou inline
    -- Botões (tabs)
    local btns = root:tag('div'):addClass('gb-btns')

    btns:tag('button')
        :addClass('gb-btn'):addClass('active')
        :attr('onclick', "gbSwitch('n',this)")
        :wikitext('Normal ')
        :tag('span'):addClass('gb-badge'):addClass('badge-n')
        :wikitext('Nível ' .. normal_nivel)

    btns:tag('button')
        :addClass('gb-btn')
        :attr('onclick', "gbSwitch('h',this)")
        :wikitext('Hard ')
        :tag('span'):addClass('gb-badge'):addClass('badge-h')
        :wikitext(hard_equip)

    -- Painel Normal
    local pn = root:tag('div'):addClass('gb-panel'):addClass('active'):attr('id', 'gbpanel-n')
    pn:tag('div'):addClass('gb-title'):wikitext('Requisitos — Normal')
    local ln = pn:tag('ul'):addClass('gb-list')
    ln:tag('li')
        :tag('span'):addClass('gb-dot'):addClass('dot-n'):done()
        :tag('span'):wikitext('Nível mínimo: '):tag('b'):wikitext(normal_nivel)
    ln:tag('li')
        :tag('span'):addClass('gb-dot'):addClass('dot-n'):done()
        :tag('span'):wikitext('Equipamento recomendado: '):tag('b'):wikitext(normal_equip)

    -- Painel Hard
    local ph = root:tag('div'):addClass('gb-panel'):attr('id', 'gbpanel-h')
    ph:tag('div'):addClass('gb-title'):wikitext('Requisitos — Hard')
    local lh = ph:tag('ul'):addClass('gb-list')
    lh:tag('li')
        :tag('span'):addClass('gb-dot'):addClass('dot-h'):done()
        :tag('span'):wikitext('Recomendado utilizar um '):tag('b'):wikitext(hard_personagem)
    lh:tag('li')
        :tag('span'):addClass('gb-dot'):addClass('dot-h'):done()
        :tag('span'):wikitext('Equipamento recomendado: '):tag('b'):wikitext(hard_equip)

    -- Script
    local script = mw.html.create('script')
    script:wikitext([[
function gbSwitch(tab,btn){
['n','h'].forEach(function(t){document.getElementById('gbpanel-'+t).classList.remove('active');});
document.querySelectorAll('.gb-btn').forEach(function(b){b.classList.remove('active');});
document.getElementById('gbpanel-'+tab).classList.add('active');
btn.classList.add('active');
}]])

    -- CSS inline
    local style = mw.html.create('style')
    style:wikitext([[
.gb-wrap{font-family:sans-serif;max-width:600px}
.gb-btns{display:flex;border-bottom:2px solid #a2a9b1;margin-bottom:0}
.gb-btn{padding:8px 22px;font-size:14px;font-weight:bold;color:#54595d;background:transparent;border:none;border-bottom:3px solid transparent;margin-bottom:-2px;cursor:pointer;display:flex;align-items:center;gap:6px}
.gb-btn:hover{color:#202122}
.gb-btn.active{color:#202122;border-bottom-color:#3680b0}
.gb-badge{font-size:11px;padding:2px 8px;border-radius:20px;font-weight:bold}
.badge-n{background:#ddeeff;color:#185FA5}
.badge-h{background:#fce8e8;color:#a32d2d}
.gb-panel{display:none;padding:14px 2px}
.gb-panel.active{display:block}
.gb-title{font-size:11px;font-weight:bold;color:#72777d;text-transform:uppercase;letter-spacing:.06em;margin-bottom:10px}
.gb-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px}
.gb-list li{display:flex;align-items:flex-start;gap:8px;font-size:14px;color:#202122;line-height:1.5}
.gb-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0;margin-top:5px}
.dot-n{background:#3680b0}
.dot-h{background:#e24b4a}
@media(max-width:480px){.gb-btn{padding:8px 14px;font-size:13px}}]])

    return tostring(style) .. tostring(root) .. tostring(script)
end

return p