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

De Wiki Gla
Ir para navegação Ir para pesquisar
 
(38 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
-- Idiomático para MediaWiki (Scribunto), com parsing de argumentos via Module:Arguments (se existir)
-- Autor: Você ; Licença: CC BY-SA 4.0 (ajuste conforme a wiki)
local p = {}
local p = {}


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


-- Dependências opcionais
    local normal_nivel    = mw.text.trim(args['normal_nivel']    or '140')
local getArgs
    local normal_equip    = mw.text.trim(args['normal_equip']   or 'Set +8')
local ok, Args = pcall(require, 'Module:Arguments')
    local hard_personagem = mw.text.trim(args['hard_personagem'] or 'personagem 4 ou 5 estrelas (Diamante)')
if ok and type(Args) == 'table' then
    local hard_equip      = mw.text.trim(args['hard_equip']      or 'Set +16')
getArgs = function(frame)
return Args.getArgs(frame, { remap = { ["mostrar_tabela"] = "mostrar_tabela" } })
end
else
-- Fallback simples se Module:Arguments não existir
getArgs = function(frame)
return frame:getParent() and frame:getParent().args or frame.args or {}
end
end
 
 
-- =============== CONFIG ===============
local CONFIG = {
tiers = { 'bronze', 'prata', 'ouro', 'diamante' },
labels = { berry = 'Berry', frag = 'Fragmentos', pedras = 'Pedras' },
costs = {
star = {
bronze = { [2]={berry=270,frag=40}, [3]={berry=1800,frag=80}, [4]={berry=13500,frag=180}, [5]={berry=75000,frag=540} },
prata = { [2]={berry=540,frag=40}, [3]={berry=3600,frag=80}, [4]={berry=27000,frag=180}, [5]={berry=180000,frag=540} },
ouro = { [2]={berry=1800,frag=40}, [3]={berry=18000,frag=80}, [4]={berry=180000,frag=180}, [5]={berry=1800000,frag=540} },
diamante={ [2]={berry=18000,frag=40}, [3]={berry=180000,frag=80}, [4]={berry=1800000,frag=180}, [5]={berry=5000000,frag=0,pedras=100} },
},
tierUp = { bronze={berry=0,frag=0,pedras=0}, prata={berry=0,frag=0,pedras=0}, ouro={berry=0,frag=0,pedras=0}, diamante=nil },
},
aliases = { ouro = {'gold'} },
}
 
 
-- ============== UTIL ==================
local function norm(s)
if type(s) ~= 'string' then return nil end
s = mw.ustring.lower(s)
s = s:gsub('á','a'):gsub('â','a'):gsub('ã','a'):gsub('é','e'):gsub('ê','e'):gsub('í','i'):gsub('ó','o'):gsub('ô','o'):gsub('ú','u')
return s
end


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


local function yesno(v)
    -- CSS via TemplateStyles (recomendado) ou inline
local t = type(v)
    -- Botões (tabs)
if t == 'boolean' then return v end
    local btns = root:tag('div'):addClass('gb-btns')
if t == 'number' then return v ~= 0 end
if t == 'string' then
v = norm(v)
return not (v == 'nao' or v == 'não' or v == 'n' or v == 'no' or v == 'false' or v == '0' or v == '')
end
return false
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 clamp(v, lo, hi)
    btns:tag('button')
v = tonumber(v) or lo
        :addClass('gb-btn')
if v < lo then return lo end
        :attr('onclick', "gbSwitch('h',this)")
if v > hi then return hi end
        :wikitext('Hard ')
return math.floor(v)
        :tag('span'):addClass('gb-badge'):addClass('badge-h')
end
        :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)


local function tierIndex(name)
    -- Painel Hard
local n = norm(name)
    local ph = root:tag('div'):addClass('gb-panel'):attr('id', 'gbpanel-h')
if not n then return nil end
    ph:tag('div'):addClass('gb-title'):wikitext('Requisitos — Hard')
for i, t in ipairs(CONFIG.tiers) do if n == t then return i end end
    local lh = ph:tag('ul'):addClass('gb-list')
for base, list in pairs(CONFIG.aliases or {}) do
    lh:tag('li')
for _, alias in ipairs(list) do if n == alias then return tierIndex(base) end end
        :tag('span'):addClass('gb-dot'):addClass('dot-h'):done()
end
        :tag('span'):wikitext('Recomendado utilizar um '):tag('b'):wikitext(hard_personagem)
return nil
    lh:tag('li')
end
        :tag('span'):addClass('gb-dot'):addClass('dot-h'):done()
 
        :tag('span'):wikitext('Equipamento recomendado: '):tag('b'):wikitext(hard_equip)


local function getTierName(idx) return CONFIG.tiers[idx] end
    -- 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}}]])


local function addCost(a, b)
    return tostring(style) .. tostring(root) .. tostring(script)
a = a or { berry=0, frag=0, pedras=0 }
b = b or { berry=0, frag=0, pedras=0 }
return { berry=(a.berry or 0)+(b.berry or 0), frag=(a.frag or 0)+(b.frag or 0), pedras=(a.pedras or 0)+(b.pedras or 0) }
end
end


local function starCost(tierName, starTo)
local t = CONFIG.costs.star[tierName]
return p
return p
end

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