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
-- Módulo:BossDisplay
-- Idiomático para MediaWiki (Scribunto), com parsing de argumentos via Module:Arguments (se existir)
local p = {}
-- Autor: Você ; Licença: CC BY-SA 4.0 (ajuste conforme a wiki)
 
function p.bossInfo(frame)
    local args = frame:getParent().args
 
    local function g(k, default)
        return mw.text.trim(args[k] or "") ~= "" and args[k] or default
    end
 
    local img        = g("img",        "Placeholder.png")
    local nome      = g("nome",      "Nome do Boss")
    local frase      = g("frase",      "Frase ou lema do boss.")
    local hp        = g("hp",        "???")
    local exp        = g("exp",       "???")
    local nivel      = g("nivel",      "???")
    local fresco    = g("fresco",    "-")
    local forte      = g("forte",      "-")
    local reflete    = g("reflete",  "-")
    local comum      = g("comum",    "")
    local semiraro  = g("semiraro",  "")
    local raro      = g("raro",      "")
    local muitoRaro  = g("muitoraro", "")


    local html = mw.html.create("div")
        :addClass("boss-container")
        :css{
            background = "#18181b",
            ["border-radius"] = "12px",
            padding = "30px",
            color = "#fff",
            width = "700px",
            margin = "auto",
            ["font-family"] = "Verdana,sans-serif"
        }


local p = {}
    -- Título
    html:tag("div")
        :css("font-size", "1.5em")
        :css("font-weight", "bold")
        :css("margin-bottom", "10px")
        :wikitext("Bosses")
 
    -- Variantes
    local var = html:tag("div")
        :css("margin-bottom", "24px")
 
    var:tag("span")
        :css{
            ["background-color"] = "#232329",
            ["border-radius"] = "7px 0 0 7px",
            padding = "7px 20px",
            ["font-size"] = "1em",
            color = "#cbcdd7",
            ["font-weight"] = "600"
        }
        :wikitext("Unbound Crimsonveil")
 
    var:tag("span")
        :css{
            ["background-color"] = "#19171c",
            ["border-radius"] = "0 7px 7px 0",
            padding = "7px 20px",
            ["font-size"] = "1em",
            color = "#fff",
            ["font-weight"] = "600",
            border = "2px solid #c7a047",
            ["border-left"] = "0"
        }
        :wikitext("Archon Crimsonveil")
 
    -- Container principal
    local main = html:tag("div")
        :css{
            display = "flex",
            ["align-items"] = "center"
        }
 
    -- Imagem
    main:tag("div")
        :css{ width = "110px", flex = "none" }
        :wikitext(string.format("[[Arquivo:%s|90x90px]]", img))


    -- Nome + frase
    local textBox = main:tag("div")


-- Dependências opcionais
    textBox:tag("div")
local getArgs
        :css{ ["font-size"] = "1.2em", ["font-weight"] = "bold", color = "#e82b2b" }
local ok, Args = pcall(require, 'Module:Arguments')
        :wikitext(nome)
if ok and type(Args) == 'table' then
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


    textBox:tag("div")
        :css{ ["font-size"] = "95%", color = "#eaa85d", ["font-style"] = "italic" }
        :wikitext(string.format('"%s"', frase))


-- =============== CONFIG ===============
    -- Stats
local CONFIG = {
    local stats = main:tag("div")
tiers = { 'bronze', 'prata', 'ouro', 'diamante' },
        :css{
labels = { berry = 'Berry', frag = 'Fragmentos', pedras = 'Pedras' },
            ["margin-left"] = "auto",
costs = {
            display = "flex",
star = {
            ["flex-direction"] = "column",
bronze = { [2]={berry=270,frag=40}, [3]={berry=1800,frag=80}, [4]={berry=13500,frag=180}, [5]={berry=75000,frag=540} },
            ["align-items"] = "flex-end",
prata = { [2]={berry=540,frag=40}, [3]={berry=3600,frag=80}, [4]={berry=27000,frag=180}, [5]={berry=180000,frag=540} },
            gap = "6px"
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'} },
}


    local statBox = stats:tag("div")
        :css{
            ["background-color"] = "#222126",
            ["border-radius"] = "8px",
            padding = "12px 20px",
            ["min-width"] = "170px"
        }


-- ============== UTIL ==================
    local sline = statBox:tag("div")
local function norm(s)
        :css{
if type(s) ~= 'string' then return nil end
            display = "flex",
s = mw.ustring.lower(s)
            ["align-items"] = "center",
s = s:gsub('á','a'):gsub('â','a'):gsub('ã','a'):gsub('é','e'):gsub('ê','e'):gsub('í','i'):gsub('ó','o'):gsub('ô','o'):gsub('ú','u')
            gap = "18px"
return s
        }
end


    sline:tag("span")
        :attr("title", "HP")
        :css{ color = "#fb3d3d", ["font-weight"] = "bold" }
        :wikitext(string.format('<span style="font-size:1.15em;">&#x2764;&#xFE0F; %s</span>', hp))


local function yesno(v)
    sline:tag("span")
local t = type(v)
        :attr("title", "EXP")
if t == 'boolean' then return v end
        :css{ color = "#ffe568", ["font-weight"] = "bold" }
if t == 'number' then return v ~= 0 end
        :wikitext(string.format('<span style="font-size:1.08em;">&#x1F4B0; %s</span>', exp))
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


    sline:tag("span")
        :attr("title", "Nível")
        :css{ color = "#6ca8fb", ["font-weight"] = "bold" }
        :wikitext(string.format('<span style="font-size:1.04em;">&#x2694;&#xFE0F; %s</span>', nivel))


local function clamp(v, lo, hi)
    -- Frescor / forte / reflete
v = tonumber(v) or lo
    local infoLine = stats:tag("div")
if v < lo then return lo end
        :css{
if v > hi then return hi end
            ["margin-top"] = "5px",
return math.floor(v)
            ["font-size"] = "90%",
end
            color = "#cfccff"
        }


    infoLine:wikitext(string.format("<b>Frescor:</b> %s ", fresco))
    infoLine:wikitext(string.format('<span style="margin-left:12px;"><b>Forte:</b> %s</span>', forte))
    infoLine:wikitext(string.format('<span style="margin-left:12px;"><b>Reflete:</b> %s</span>', reflete))


local function tierIndex(name)
    -- Loot table
local n = norm(name)
    local loot = html:tag("div")
if not n then return nil end
        :css{
for i, t in ipairs(CONFIG.tiers) do if n == t then return i end end
            ["margin-top"] = "28px",
for base, list in pairs(CONFIG.aliases or {}) do
            background = "#232329",
for _, alias in ipairs(list) do if n == alias then return tierIndex(base) end end
            ["border-radius"] = "10px",
end
            padding = "18px"
return nil
        }
end


    local tableEl = loot:tag("table")
        :css{
            width = "100%",
            color = "#fff",
            ["table-layout"] = "auto"
        }


local function getTierName(idx) return CONFIG.tiers[idx] end
    local function row(label, color, content)
        local tr = tableEl:tag("tr")
        tr:tag("th")
            :css{
                ["text-align"] = "left",
                color = color,
                padding = "6px",
                ["font-size"] = "1.07em"
            }
            :wikitext(label)
        tr:tag("td"):wikitext(content)
    end


    row("Comum:",      "#f3e8bb", comum)
    row("Semi-Raro:",  "#aeccff", semiraro)
    row("Raro:",      "#e6e5ff", raro)
    row("Muito Raro:", "#f9538f", muitoRaro)


local function addCost(a, b)
    return tostring(html)
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 das 06h53min de 22 de novembro de 2025

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

-- Módulo:BossDisplay
local p = {}

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

    local function g(k, default)
        return mw.text.trim(args[k] or "") ~= "" and args[k] or default
    end

    local img        = g("img",        "Placeholder.png")
    local nome       = g("nome",       "Nome do Boss")
    local frase      = g("frase",      "Frase ou lema do boss.")
    local hp         = g("hp",         "???")
    local exp        = g("exp",        "???")
    local nivel      = g("nivel",      "???")
    local fresco     = g("fresco",     "-")
    local forte      = g("forte",      "-")
    local reflete     = g("reflete",   "-")
    local comum      = g("comum",     "")
    local semiraro   = g("semiraro",  "")
    local raro       = g("raro",      "")
    local muitoRaro  = g("muitoraro", "")

    local html = mw.html.create("div")
        :addClass("boss-container")
        :css{
            background = "#18181b",
            ["border-radius"] = "12px",
            padding = "30px",
            color = "#fff",
            width = "700px",
            margin = "auto",
            ["font-family"] = "Verdana,sans-serif"
        }

    -- Título
    html:tag("div")
        :css("font-size", "1.5em")
        :css("font-weight", "bold")
        :css("margin-bottom", "10px")
        :wikitext("Bosses")

    -- Variantes
    local var = html:tag("div")
        :css("margin-bottom", "24px")

    var:tag("span")
        :css{
            ["background-color"] = "#232329",
            ["border-radius"] = "7px 0 0 7px",
            padding = "7px 20px",
            ["font-size"] = "1em",
            color = "#cbcdd7",
            ["font-weight"] = "600"
        }
        :wikitext("Unbound Crimsonveil")

    var:tag("span")
        :css{
            ["background-color"] = "#19171c",
            ["border-radius"] = "0 7px 7px 0",
            padding = "7px 20px",
            ["font-size"] = "1em",
            color = "#fff",
            ["font-weight"] = "600",
            border = "2px solid #c7a047",
            ["border-left"] = "0"
        }
        :wikitext("Archon Crimsonveil")

    -- Container principal
    local main = html:tag("div")
        :css{
            display = "flex",
            ["align-items"] = "center"
        }

    -- Imagem
    main:tag("div")
        :css{ width = "110px", flex = "none" }
        :wikitext(string.format("[[Arquivo:%s|90x90px]]", img))

    -- Nome + frase
    local textBox = main:tag("div")

    textBox:tag("div")
        :css{ ["font-size"] = "1.2em", ["font-weight"] = "bold", color = "#e82b2b" }
        :wikitext(nome)

    textBox:tag("div")
        :css{ ["font-size"] = "95%", color = "#eaa85d", ["font-style"] = "italic" }
        :wikitext(string.format('"%s"', frase))

    -- Stats
    local stats = main:tag("div")
        :css{
            ["margin-left"] = "auto",
            display = "flex",
            ["flex-direction"] = "column",
            ["align-items"] = "flex-end",
            gap = "6px"
        }

    local statBox = stats:tag("div")
        :css{
            ["background-color"] = "#222126",
            ["border-radius"] = "8px",
            padding = "12px 20px",
            ["min-width"] = "170px"
        }

    local sline = statBox:tag("div")
        :css{
            display = "flex",
            ["align-items"] = "center",
            gap = "18px"
        }

    sline:tag("span")
        :attr("title", "HP")
        :css{ color = "#fb3d3d", ["font-weight"] = "bold" }
        :wikitext(string.format('<span style="font-size:1.15em;">&#x2764;&#xFE0F; %s</span>', hp))

    sline:tag("span")
        :attr("title", "EXP")
        :css{ color = "#ffe568", ["font-weight"] = "bold" }
        :wikitext(string.format('<span style="font-size:1.08em;">&#x1F4B0; %s</span>', exp))

    sline:tag("span")
        :attr("title", "Nível")
        :css{ color = "#6ca8fb", ["font-weight"] = "bold" }
        :wikitext(string.format('<span style="font-size:1.04em;">&#x2694;&#xFE0F; %s</span>', nivel))

    -- Frescor / forte / reflete
    local infoLine = stats:tag("div")
        :css{
            ["margin-top"] = "5px",
            ["font-size"] = "90%",
            color = "#cfccff"
        }

    infoLine:wikitext(string.format("<b>Frescor:</b> %s ", fresco))
    infoLine:wikitext(string.format('<span style="margin-left:12px;"><b>Forte:</b> %s</span>', forte))
    infoLine:wikitext(string.format('<span style="margin-left:12px;"><b>Reflete:</b> %s</span>', reflete))

    -- Loot table
    local loot = html:tag("div")
        :css{
            ["margin-top"] = "28px",
            background = "#232329",
            ["border-radius"] = "10px",
            padding = "18px"
        }

    local tableEl = loot:tag("table")
        :css{
            width = "100%",
            color = "#fff",
            ["table-layout"] = "auto"
        }

    local function row(label, color, content)
        local tr = tableEl:tag("tr")
        tr:tag("th")
            :css{
                ["text-align"] = "left",
                color = color,
                padding = "6px",
                ["font-size"] = "1.07em"
            }
            :wikitext(label)
        tr:tag("td"):wikitext(content)
    end

    row("Comum:",      "#f3e8bb", comum)
    row("Semi-Raro:",  "#aeccff", semiraro)
    row("Raro:",       "#e6e5ff", raro)
    row("Muito Raro:", "#f9538f", muitoRaro)

    return tostring(html)
end

return p