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

De Wiki Gla
Ir para navegação Ir para pesquisar
Linha 1: Linha 1:
-- [[Module:Gb]] — Calculadora de custos de tiers/estrelas


local function renderCompact(total, opts)
 
-- ============== CORE ==================
local function computePath(ti, si, tf, sf)
local steps, total = {}, { berry=0, frag=0, pedras=0 }
local iTier, iStar = ti, si
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
 
 
-- ============= RENDER =================
local function pill(class, value)
return string.format('<span class="gb-pill %s">%s</span>', class, value)
end
 
 
local function renderTable(steps, total, opts)
local h = mw.html.create('div'):addClass('calc-tier')
local h = mw.html.create('div'):addClass('calc-tier')
if opts.titulo then h:tag('h3'):wikitext(opts.titulo) end
if opts.titulo and opts.titulo ~= '' then h:tag('h3'):wikitext(opts.titulo) end
local box = h:tag('div'):addClass('calc-tier-total')
local tbl = h:tag('table'):addClass('wikitable'):css('width','100%')
box:wikitext(string.format(
local tr = tbl:tag('tr')
'<b>Total:</b> %s • %s • %s: %s',
tr:tag('th'):wikitext('Passo'); tr:tag('th'):wikitext('Ação')
pill('gold', formatNumber(total.berry, opts.sepMilhar)),
tr:tag('th'):wikitext(CONFIG.labels.berry)
pill('green', formatNumber(total.frag, opts.sepMilhar)),
tr:tag('th'):wikitext(CONFIG.labels.frag)
CONFIG.labels.pedras,
tr:tag('th'):wikitext(CONFIG.labels.pedras)
formatNumber(total.pedras, opts.sepMilhar)
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)
return tostring(h)
end
end




-- =====================
local function renderCompact(total, opts)
-- ENTRADA PÚBLICA
local h = mw.html.create('div'):addClass('calc-tier')
-- =====================
if opts.titulo and opts.titulo ~= '' then h:tag('h3'):wikitext(opts.titulo) end
local function parseInt(v, default)
local box = h:tag('div'):addClass('calc-tier-total')
local n = tonumber(v)
box:wikitext(('<b>Total:</b> %s • %s • %s: %s')
if not n then return default end
:format(pill('gold', formatNumber(total.berry, opts.sep)), pill('green', formatNumber(total.frag, opts.sep)), CONFIG.labels.pedras, formatNumber(total.pedras, opts.sep)))
return math.floor(n)
return tostring(h)
end
end




-- ============= ENTRY ==================
function p.calcular(frame)
function p.calcular(frame)
local args = frame:getParent() and frame:getParent().args or frame.args
local args = getArgs(frame)
 
 
-- parâmetros principais
local inicioTier = args.inicio_tier or args.de_tier or args.tier_inicial
local inicioTier = args.inicio_tier or args.de_tier or args.tier_inicial
local fimTier = args.fim_tier or args.ate_tier or args.tier_final
local fimTier = args.fim_tier or args.ate_tier or args.tier_final
local inicioEst = clamp(parseInt(args.inicio_estrela or 0, 0), 0, 5)
if not inicioTier or not fimTier then return "Erro: defina 'inicio_tier' e 'fim_tier'." end
local fimEst = clamp(parseInt(args.fim_estrela or 0, 0), 0, 5)




-- opções visuais e formato
local ti, tf = tierIndex(inicioTier), tierIndex(fimTier)
local titulo = args.titulo
if not ti or not tf then return 'Erro: tier inválido. Use: bronze, prata, ouro, diamante.' end
local mostrarTabela = tostring(args.mostrar_tabela or 'sim') ~= 'nao' -- compat
local layout = norm(args.layout or (mostrarTabela and 'tabela' or 'compacto')) -- 'tabela' | 'compacto'
local sepMilhar = args.separador_milhar or '.'




if not inicioTier or not fimTier then
local inicioEst = clamp(args.inicio_estrela or 0, 0, 5)
return "Erro: defina 'inicio_tier' e 'fim_tier'."
local fimEst = clamp(args.fim_estrela or 0, 0, 5)
end
if (ti > tf) or (ti == tf and inicioEst > fimEst) then return 'Erro: o alvo precisa ser maior que o estado inicial.' end




local ti = tierIndex(inicioTier)
local steps, total = computePath(ti, inicioEst, tf, fimEst)
local tf = tierIndex(fimTier)
if not ti or not tf then
return "Erro: tier inválido. Use: bronze, prata, ouro, diamante."
end
 


if (ti > tf) or (ti == tf and inicioEst > fimEst) then
return "Erro: o alvo precisa ser maior que o estado inicial."
end


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 steps, total = computePath(ti, inicioEst, tf, fimEst)
local opts = { titulo = titulo, sepMilhar = sepMilhar }


 
local opts = { titulo = args.titulo, sep = args.separador_milhar or '.' }
if layout == 'compacto' then
if layout == 'compacto' then return renderCompact(total, opts) end
return renderCompact(total, opts)
else
return renderTable(steps, total, opts)
return renderTable(steps, total, opts)
end
end
end




return p
return p

Edição das 21h03min de 26 de setembro de 2025

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

-- [[Module:Gb]] — Calculadora de custos de tiers/estrelas


-- ============== CORE ==================
local function computePath(ti, si, tf, sf)
local steps, total = {}, { berry=0, frag=0, pedras=0 }
local iTier, iStar = ti, si
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


-- ============= RENDER =================
local function pill(class, value)
return string.format('<span class="gb-pill %s">%s</span>', class, value)
end


local function renderTable(steps, 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 tbl = h:tag('table'):addClass('wikitable'):css('width','100%')
local tr = tbl:tag('tr')
tr:tag('th'):wikitext('Passo'); tr:tag('th'):wikitext('Ação')
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


-- ============= ENTRY ==================
function p.calcular(frame)
local args = getArgs(frame)
local inicioTier = args.inicio_tier or args.de_tier or args.tier_inicial
local fimTier = args.fim_tier or args.ate_tier or args.tier_final
if not inicioTier or not fimTier then return "Erro: defina 'inicio_tier' e 'fim_tier'." end


local ti, tf = tierIndex(inicioTier), tierIndex(fimTier)
if not ti or not tf then return 'Erro: tier inválido. Use: bronze, prata, ouro, diamante.' end


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


return p