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

De Wiki Gla
Ir para navegação Ir para pesquisar
Etiqueta: Revertido
m
 
(13 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
local p = {}
local p = {}
local itemData = require("Módulo:ItemData")
local Item = require("Módulo:Item")


local function formatNumber(num)
local function formatNumber(num)
Linha 16: Linha 16:
end
end


local function buscarChaveCorreta(nome)
local function parseItemEntry(entry)
     local base = mw.text.trim(nome):lower():gsub("_", " "):gsub("%.png$", ""):gsub("%.gif$", ""):gsub("%.jpg$", ""):gsub("%.webp$", "")
     entry = mw.text.trim(entry)
     for chave, _ in pairs(itemData) do
    if entry == "" then return nil, nil end
         local kbase = chave:lower():gsub("_", " "):gsub("%.png$", ""):gsub("%.gif$", ""):gsub("%.jpg$", ""):gsub("%.webp$", "")
 
        if kbase == base then
    local ident, qtdStr
            return chave
 
        end
    if entry:find(";") then
        ident, qtdStr = entry:match("^(.-)%s*;%s*(%d+)$")
     else
         ident, qtdStr = entry:match("^(.-)%s*:%s*(%d+)$")
     end
     end
     return nil
 
     if not ident or not qtdStr then return nil, nil end
    return mw.text.trim(ident), tonumber(qtdStr)
end
end


local function parseItens(raw)
local function parseItens(raw, ilha)
     local resultado = {}
     local resultado = {}
     for item in mw.text.gsplit(raw or "", ",", true) do
 
         local nome, qtd = item:match("^%s*(.-)%s*:%s*(%d+)%s*$")
     for entry in mw.text.gsplit(raw or "", ",", true) do
         if nome and qtd then
         local ident, qtd = parseItemEntry(entry)
             local chave = buscarChaveCorreta(nome) or (nome .. ".png")
         if ident and qtd then
             qtd = tonumber(qtd) or 0
             local item = Item.resolve(ident)
             resultado[chave] = (resultado[chave] or 0) + qtd
            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
     end
     end
     return resultado
     return resultado
end
end
Linha 42: Linha 64:
local function mergeRecompensas(lista)
local function mergeRecompensas(lista)
     local total = {}
     local total = {}
     for _, raw in ipairs(lista) do
     for _, item in ipairs(lista) do
         local dados = parseItens(raw)
         local dados = parseItens(item.itens, item.ilha)
         for nome, qtd in pairs(dados) do
         for key, info in pairs(dados) do
             total[nome] = (total[nome] or 0) + qtd
             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
     end
     end
     return total
     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
end


function p.total(frame)
function p.total(frame)
     local args = frame:getParent().args or {}
     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 bonus = args.bonus or ""
    local lang = args.lang or "pt"
     local content = mw.title.getCurrentTitle():getContent()
     local content = mw.title.getCurrentTitle():getContent()
    local rewardCalls = {}


     for bloco in content:gmatch("{{%s*[Rr]eward.-}}") do
     local rewardCalls = extrairRecompensasValidas(content)
        local itens = bloco:match("itens%s*=%s*([^|}]+)")
    if bonus and bonus ~= "" then
         if itens then table.insert(rewardCalls, itens) end
         table.insert(rewardCalls, { itens = bonus })
     end
     end
    if bonus and bonus ~= "" then table.insert(rewardCalls, bonus) end


     local total = mergeRecompensas(rewardCalls)
     local total = mergeRecompensas(rewardCalls)
Linha 68: Linha 129:
     local html = mw.html.create("div")
     local html = mw.html.create("div")
     html:addClass("introquest-items")
     html:addClass("introquest-items")
    -- Adiciona o título "Recompensas" apenas se houver recompensas
    html:tag("div"):addClass("reward-title"):wikitext("Recompensas:")


     local outros = {}
     local outros = {}
     local berries = {}
     local berries = {}


     for nome, qtd in pairs(total) do
     for _, info in pairs(total) do
         local data = itemData[nome] or {}
         local qtd = info.qtd
         local nomeCompleto = data.nome or nome
         local ilha = info.ilha or ""
         local desc = data.desc
         local item = info.item
         local tooltip = nomeCompleto
         local image = (Item.getImage(item) or ""):lower()
         if desc and desc ~= "" then
 
             tooltip = tooltip .. "\n—\n" .. desc
         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
         end


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


         if nome:lower() == "berries.gif" then
         if bloco.isBerries then
             table.insert(berries, bloco)
             table.insert(berries, bloco)
         else
         else
Linha 98: Linha 168:


     local function addBloco(bloco)
     local function addBloco(bloco)
         local wrap = html:tag("span")
         html:wikitext(Item.renderOne(bloco.item, bloco.qtd, lang, {
        wrap:addClass("item-wrapper")
            showTooltip = true,
        wrap:attr("data-tooltip", bloco.tooltip)
            showCount = true
        wrap:attr("data-item", bloco.arquivo:lower())
         }))
        wrap:tag("span"):wikitext(string.format("[[Arquivo:%s|link=]]", bloco.arquivo))
 
        local quantidade = wrap:tag("span"):addClass("item-count")
         if bloco.arquivo:lower() ~= "berries.gif" then
            quantidade:tag("span"):addClass("item-count-x"):wikitext("x")
        end
        quantidade:wikitext(bloco.qtd)
     end
     end


Linha 118: Linha 181:


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

Edição atual tal como às 02h43min de 17 de março de 2026

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