Módulo:Quest

De Wiki Gla
Revisão de 02h43min de 17 de março de 2026 por Gurren1 (discussão | contribs)
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

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

local p = {}
local Item = require("Módulo:Item")

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 parseItens(raw, ilha)
    local resultado = {}

    for entry in mw.text.gsplit(raw or "", ",", true) do
        local ident, qtd = parseItemEntry(entry)
        if ident and qtd 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 key = tostring(item.id or (Item.getImage(item) or ident):lower())
            if not resultado[key] then
                resultado[key] = { item = item, qtd = 0, ilha = nil }
            end
            resultado[key].qtd = resultado[key].qtd + qtd
            if ilha and ilha ~= "" and not resultado[key].ilha then
                resultado[key].ilha = ilha
            end
        end
    end

    return resultado
end

local function mergeRecompensas(lista)
    local total = {}
    for _, item in ipairs(lista) do
        local dados = parseItens(item.itens, item.ilha)
        for key, info in pairs(dados) do
            if not total[key] then
                total[key] = { item = info.item, qtd = 0, ilha = nil }
            end
            total[key].qtd = total[key].qtd + info.qtd
            if info.ilha and info.ilha ~= "" and not total[key].ilha then
                total[key].ilha = info.ilha
            end
        end
    end
    return total
end

local function extrairRecompensasValidas(content)
    local recompensas = {}
    for bloco in content:gmatch("{{%s*[Rr]eward.-}}") do
        if not bloco:match("ignore%s*=") then
            local itens = bloco:match("itens%s*=%s*([^|}]+)")
            if itens then
                local ilha = bloco:match("ilha%s*=%s*([^|}]+)")
                table.insert(recompensas, { itens = itens, ilha = ilha })
            end
        end
    end
    return recompensas
end

function p.hasRewards(frame)
    local args = frame.args or {}
    if not next(args) and frame:getParent() then
        args = frame:getParent().args or {}
    end
    local bonus = args.bonus or ""
    local content = mw.title.getCurrentTitle():getContent()

    local rewardCalls = extrairRecompensasValidas(content)
    if bonus and bonus ~= "" then
        table.insert(rewardCalls, { itens = bonus })
    end

    local total = mergeRecompensas(rewardCalls)
    return next(total) and "1" or ""
end

function p.total(frame)
    local args = frame.args or {}
    if not next(args) and frame:getParent() then
        args = frame:getParent().args or {}
    end
    local bonus = args.bonus or ""
    local lang = args.lang or "pt"
    local content = mw.title.getCurrentTitle():getContent()

    local rewardCalls = extrairRecompensasValidas(content)
    if bonus and bonus ~= "" then
        table.insert(rewardCalls, { itens = bonus })
    end

    local total = mergeRecompensas(rewardCalls)
    if next(total) == nil then return "" end

    local html = mw.html.create("div")
    html:addClass("introquest-items")

    local outros = {}
    local berries = {}

    for _, info in pairs(total) do
        local qtd = info.qtd
        local ilha = info.ilha or ""
        local item = info.item
        local image = (Item.getImage(item) or ""):lower()

        if image == "pose.png" and ilha ~= "" then
            local newNames = {}
            if item.names then
                for k, v in pairs(item.names) do newNames[k] = v end
            end
            newNames.pt = "Eternal Pose - " .. ilha
            newNames.en = "Eternal Pose - " .. ilha
            local cloned = {}
            for k, v in pairs(item) do cloned[k] = v end
            cloned.names = newNames
            cloned.desc = nil
            item = cloned
        end

        local bloco = {
            item = item,
            qtd = formatNumber(qtd),
            isBerries = info.item and info.item.category == "currency"
                and image:find("berries")
        }

        if bloco.isBerries then
            table.insert(berries, bloco)
        else
            table.insert(outros, bloco)
        end
    end

    local function addBloco(bloco)
        html:wikitext(Item.renderOne(bloco.item, bloco.qtd, lang, {
            showTooltip = true,
            showCount = true
        }))
    end

    for _, b in ipairs(outros) do addBloco(b) end
    for _, b in ipairs(berries) do addBloco(b) end

    return tostring(html)
end

function p.requisitos(frame)
    local args = frame.args or {}
    if not next(args) and frame:getParent() then
        args = frame:getParent().args or {}
    end
    local raw = args.requisitos or ""
    if mw.text.trim(raw) == "" then return "" end

    local output = {}
    for item in mw.text.gsplit(raw, ",", true) do
        local clean = mw.text.trim(item)
        if clean ~= "" then table.insert(output, "* " .. clean) end
    end
    return table.concat(output, "\n")
end

return p